• <xmp id="4g4m2"><menu id="4g4m2"></menu><menu id="4g4m2"><strong id="4g4m2"></strong></menu>
    <xmp id="4g4m2">
  • <menu id="4g4m2"></menu>
  • <dd id="4g4m2"></dd>
  • 只發布交易干貨的網站
    用實戰期貨交易系統和心得助你重塑交易認知

    正規期貨開戶 | 手續費只+1分

    90%交易者的手續費都被加收超1倍,一起看看最新的交易所手續費一覽表吧!

    MT4自帶EA(MA)源碼解析

    一、均線穿越交易系統EA詳解
    MT4平臺自帶了一個自動交易的EA指標,那就是Moving Average ,下面我們詳細解釋該系統每條語句的功能說明,以便深入認識EA的編程內核。我想對初學者有一定的幫助。
    //+------------------------------------------------------------------+
    //|? ?? ?? ?? ?? ?? ?? ?? ???Moving Average.mq4??|
    //|? ?? ???Copyright ?2005, MetaQuotes Software Corp. |
    //|? ???//+------------------------------------------------------------------+
    #define MAGICMA? ?20050610
    //定義本EA操作的訂單的唯一標識號碼,由此可以實現在同一賬戶上多系統操作,各操作EA的訂單標識碼不同,就不會互相誤操作。凡是EA皆不可缺少,非常非常重要!
    extern double Lots? ?? ?? ?? ???= 0.1; //每單的交易量
    extern double MaximumRisk? ?? ?= 0.02;//本系統最大風險系數,即可以動用總資金的2%
    extern double DecreaseFactor? ?? ?= 3;? ?//下跌因素個數
    extern double MovingPeriod? ?? ? = 12;??//均線的計算周期=12根K線;
    extern double MovingShift? ?? ?? ?= 6;? ?//均線在K線圖中向右的偏移量=6根K線;
    //extern 確定從外部程序輸入的變量, 會直接顯現輸入數據窗口。數列本身不能作為外部變量。
    注意:iMA中的MovingShift(均線偏移量)是指均線指標在圖上繪制時向左、右移動的K線個數,主要為了使圖中結果更好看,并不會對MA的計算數值產生變化。其中,該參數為正時,代表向右移動;為負值,則代表向左移動。
    //+------------------------------------------------------------------+
    //| Calculate open positions
    自定義函數(返回-整數型數據) 倉單查詢與統計 |
    //+------------------------------------------------------------------+
    int CalculateCurrentOrders(string symbol)//函數作用,計算當前持倉單的數量
    {
    int buys=0,sells=0;
    //定義兩個局部變量,整數型,buys——多單數,sells——空單數,用于訂單的統計
    //----
    for(int i=0;i//計次循環(i=0至訂單數目,i=i+1)-循環檢測當前的訂單隊列
    {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)??break;
    //如果 沒有本系統交易的倉單類型,則跳出循環
    if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
    //如果 倉單貨幣對是當前貨幣對 且 倉單編號是本系統編號 時
    (判斷這個訂單是不是當前EA操作的,避免EA誤操作其他程序控制的持倉單)
    {
    if(OrderType()==OP_BUY)? ?buys++;
    //如果 倉單類型=多單,則:在多單數上加1;
    if(OrderType()==OP_SELL) sells++;
    //如果 倉單類型=空單,則,在空單數上加1。
    }
    }
    //---- return orders volume-返回訂單數目
    if(buys>0) return(buys);
    //如果 多單>0,則返回(多單數)
    else? ? return(-sells);
    //否則,返回(-空單數)
    //本函數返回查詢計算結束時的持倉單的個數.這種模式返回是假設不存在鎖單的。
    }
    //+------------------------------------------------------------------+
    //| Calculate optimal lot size
    自定義函數(返回-小數型數據)? ?資金管理? ???|
    //+------------------------------------------------------------------+
    double LotsOptimized()//開倉量計算函數(根據要求計算出訂單交易量,小數型)
    {
    double lot=Lots(=0.1); //定義局部變量los 小數型
    int orders=HistoryTotal();??// history orders total 歷史平倉單數(已平倉)
    int losses=0;? ?? ?? ?? ? // number of losses orders without a break-虧損單
    //---- select lot size
    lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
    //計算 開倉下單量=帳戶可用資金*最大風險系數(=2%)/1000.0,并將結果保留小數點1位
    (通過風險系數的計算獲得當前入場單應該采用的交易量,除以1000是因為大多貨幣對匯價都在這個附近。)
    //---- calcuulate number of losses orders without a break-計算虧損單數目
    if(DecreaseFactor(=3)>0) //如果 下跌因素個數(=3)>0
    {
    for(int i=orders-1;i>=0;i--)
    //計次循環(i=歷史平倉單數-1,到i=0, 遞減1)
    {
    if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!");
    break; }
    //如果 沒有本系統交易記錄,輸出“無交易歷史!”
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
    //如果 訂單的貨幣對不是當前貨幣對,或者 訂單類型為掛單時,繼續運行
    //訂單類型為整數型,0-BUY,1-SELL,2-BUYLIMT,3-BUYSTOP,4-SELLLIMT,5-SELLSTOP,其中“>OP_SELL”代表掛單
    if(OrderProfit()>0) break;
    如果 盈利單數目>0,跳出循環
    if(OrderProfit()//如果 盈利單數目}
    if(losses>1)??lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
    //如果 虧損單數>1時,則 重新計算下單量,并保留小數點后1位,其計算公式為:
    下單量=(lot-lot*losses/DecreaseFactor(=3))。
    }
    //---- return lot size-返回下單量
    if(lot/如果 算出的交易量小于0.1手,則 取交易量為0.1手
    return(lot);//返回(下單量)
    }
    //+------------------------------------------------------------------+
    //| Check for open order conditions
    //自定義函數(無返回值)? ? 開倉策略? ?? ?? ?|
    //+------------------------------------------------------------------+
    void CheckForOpen()//開倉檢查(判斷開倉條件及其處理)
    {
    double ma; //定義局部變量ma為小數型
    int res;? ? //定義局部變量res為整數型
    //---- go trading only for first tiks of new bar,
    //只有在新K線的首次報價時執行
    if(Volume[0]>1) return;
    //如果當前K線的成交價次數大于1時,返回
    (不是K線的開盤時間點,即當前k線還沒收盤確定,則直接返回;否則,如果是K線第一個成交價,則向下繼續運行)
    //---- get Moving Average –獲取均線數值
    ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
    //獲取當前以收盤價為基準計算出的均線數值
    ??iMA(NULL,0,12,6,MOD_SMA,PRICE_CLOSE,0)
    //---- sell conditions-賣出條件
    if(Open[1]>ma && Close[1]//如果前1根K線下穿均線(即K線的開盤價大于均線值、收盤價小于均線值)
    {
    res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
    //發送倉單(當前貨幣對,賣出方向,開倉量計算(),買價,滑點=3,無止損,無止贏,訂單編號,標上紅色箭頭)
    return; //返回
    }
    //---- buy conditions-買入條件
    if(Open[1]ma)
    //如果前1根K線上穿均線(即K線的開盤價小于均線值、收盤價大于均線值)
    {
    res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
    //發送倉單(當前貨幣對,買入方向,開倉量計算(),賣價,滑點=3,無止損,無止贏,訂單編號,標上藍色箭頭)
    return;//返回
    }
    //----
    }
    //+------------------------------------------------------------------+
    //| Check for close order conditions
    //自定義函數(無返回值)? ? 平倉策略? ?? ?? ?|
    //+------------------------------------------------------------------+
    void CheckForClose()//平倉檢查(判斷平倉條件及其處理)
    {
    double ma;//定義局部變量ma小數型
    //---- 只在一個k收盤另一個新出現時交易
    if(Volume[0]>1) return;//如果當前K線的成交價次數>1時,則返回
    //---- get Moving Average //獲取均線數值
    ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
    //獲取當前以收盤價為基準計算出的均線數值
    for(int i=0;i{
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
    //如果 沒有本系統所交易的倉單時,跳出循環
    if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
    //如果 倉單編號不是本系統編號,或者 倉單貨幣對不是當前貨幣對時,繼續選擇
    if(OrderType()==OP_BUY)
    //如果是多單
    {
    if(Open[1]>ma && Close[1]//如果第1根K線開盤價下穿均線時(即開盤價高于均價而收盤價低于均價時),
    則進行多頭平倉(倉單編號,持倉數量,買價,滑點=3,用白色箭頭顯示)
    break;//跳出循環
    }
    if(OrderType()==OP_SELL)
    //如果是空單
    {
    if(Open[1]ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White););
    //如果第1根K線開盤價上穿均線時(即開盤價低于均價而收盤價高于均價時),
    則進行空頭平倉(倉單編號,持倉數量,賣價,滑點=3,用白色箭頭顯示)
    break;//跳出循環
    }
    }
    //----
    }
    //+------------------------------------------------------------------+
    //| Start function? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? |
    //+------------------------------------------------------------------+
    void start()//主程序—-每次成交價所驅動的運算過程
    {
    //---- check for history and trading—對交易歷史進行檢查
    if(Bars//如果K線數少于100根,或者 如果允許智能交易交易=假時,返回
    //---- calculate open orders by current symbol-計算當前貨幣對的開倉訂單
    if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
    //如果 計算出當前貨幣對開倉訂單數=0 (即沒有倉單),則進行開倉檢查。
    else??CheckForClose();
    //否則(即當前已經有倉單時),則進行平倉檢查。
    //----
    }

    二、本EA策略分析
    根據本EA系統的源代碼可以分析出:它使用的策略如下:
    1、技術指標:12周期均線系統;
    2、滑點數:3個點;
    3、開平倉法則:K線上穿均線時,無倉,則開多倉;有空倉時,則平空倉;
    ? ?? ?? ?? ?? ?K線下穿均線時,無倉,則開空倉;有多倉時,則平多倉。
    4、圖上標識:開多倉時,在圖中標示紅色箭頭;平倉時,則標示白色箭頭;
    ? ?? ?? ?? ? 開空倉時,在圖中標未藍色箭頭;平倉時,則標示白色箭頭。

    三、該系統在模擬交易中的結果分析
    以上對該EA系統進行了詳細的解析,從中可以看出EA系統的基本結構與相關策略。下面是該EA在模擬盤中1分鐘K線圖EURUSD(歐元對美元)中的開倉、平倉結果圖。
    在該系統的模擬交易過程中,基本上體現了本策略的操作思想,其中四個下單中,兩個空單和兩個多單,如下圖所示。

    MT4自帶EA(MA)源碼解析來源:外匯邦
    一、均線穿越交易系統EA詳解
    MT4平臺自帶了一個自動交易的EA指標,那就是Moving Average ,下面我們詳細解釋該系統每條語句的功能說明,以便深入認識EA的編程內核。我想對初學者有一定的幫助。
    //+------------------------------------------------------------------+
    //|? ?? ?? ?? ?? ?? ?? ?? ???Moving Average.mq4??|
    //|? ?? ???Copyright ?2005, MetaQuotes Software Corp. |
    //|? ???//+------------------------------------------------------------------+
    #define MAGICMA? ?20050610
    //定義本EA操作的訂單的唯一標識號碼,由此可以實現在同一賬戶上多系統操作,各操作EA的訂單標識碼不同,就不會互相誤操作。凡是EA皆不可缺少,非常非常重要!
    extern double Lots? ?? ?? ?? ???= 0.1; //每單的交易量
    extern double MaximumRisk? ?? ?= 0.02;//本系統最大風險系數,即可以動用總資金的2%
    extern double DecreaseFactor? ?? ?= 3;? ?//下跌因素個數
    extern double MovingPeriod? ?? ? = 12;??//均線的計算周期=12根K線;
    extern double MovingShift? ?? ?? ?= 6;? ?//均線在K線圖中向右的偏移量=6根K線;
    //extern 確定從外部程序輸入的變量, 會直接顯現輸入數據窗口。數列本身不能作為外部變量。
    注意:iMA中的MovingShift(均線偏移量)是指均線指標在圖上繪制時向左、右移動的K線個數,主要為了使圖中結果更好看,并不會對MA的計算數值產生變化。其中,該參數為正時,代表向右移動;為負值,則代表向左移動。
    //+------------------------------------------------------------------+
    //| Calculate open positions
    自定義函數(返回-整數型數據) 倉單查詢與統計 |
    //+------------------------------------------------------------------+
    int CalculateCurrentOrders(string symbol)//函數作用,計算當前持倉單的數量
    {
    int buys=0,sells=0;
    //定義兩個局部變量,整數型,buys——多單數,sells——空單數,用于訂單的統計
    //----
    for(int i=0;i//計次循環(i=0至訂單數目,i=i+1)-循環檢測當前的訂單隊列
    {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)??break;
    //如果 沒有本系統交易的倉單類型,則跳出循環
    if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
    //如果 倉單貨幣對是當前貨幣對 且 倉單編號是本系統編號 時
    (判斷這個訂單是不是當前EA操作的,避免EA誤操作其他程序控制的持倉單)
    {
    if(OrderType()==OP_BUY)? ?buys++;
    //如果 倉單類型=多單,則:在多單數上加1;
    if(OrderType()==OP_SELL) sells++;
    //如果 倉單類型=空單,則,在空單數上加1。
    }
    }
    //---- return orders volume-返回訂單數目
    if(buys>0) return(buys);
    //如果 多單>0,則返回(多單數)
    else? ? return(-sells);
    //否則,返回(-空單數)
    //本函數返回查詢計算結束時的持倉單的個數.這種模式返回是假設不存在鎖單的。
    }
    //+------------------------------------------------------------------+
    //| Calculate optimal lot size
    自定義函數(返回-小數型數據)? ?資金管理? ???|
    //+------------------------------------------------------------------+
    double LotsOptimized()//開倉量計算函數(根據要求計算出訂單交易量,小數型)
    {
    double lot=Lots(=0.1); //定義局部變量los 小數型
    int orders=HistoryTotal();??// history orders total 歷史平倉單數(已平倉)
    int losses=0;? ?? ?? ?? ? // number of losses orders without a break-虧損單
    //---- select lot size
    lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
    //計算 開倉下單量=帳戶可用資金*最大風險系數(=2%)/1000.0,并將結果保留小數點1位
    (通過風險系數的計算獲得當前入場單應該采用的交易量,除以1000是因為大多貨幣對匯價都在這個附近。)
    //---- calcuulate number of losses orders without a break-計算虧損單數目
    if(DecreaseFactor(=3)>0) //如果 下跌因素個數(=3)>0
    {
    for(int i=orders-1;i>=0;i--)
    //計次循環(i=歷史平倉單數-1,到i=0, 遞減1)
    {
    if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!");
    break; }
    //如果 沒有本系統交易記錄,輸出“無交易歷史!”
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
    //如果 訂單的貨幣對不是當前貨幣對,或者 訂單類型為掛單時,繼續運行
    //訂單類型為整數型,0-BUY,1-SELL,2-BUYLIMT,3-BUYSTOP,4-SELLLIMT,5-SELLSTOP,其中“>OP_SELL”代表掛單
    if(OrderProfit()>0) break;
    如果 盈利單數目>0,跳出循環
    if(OrderProfit()//如果 盈利單數目}
    if(losses>1)??lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
    //如果 虧損單數>1時,則 重新計算下單量,并保留小數點后1位,其計算公式為:
    下單量=(lot-lot*losses/DecreaseFactor(=3))。
    }
    //---- return lot size-返回下單量
    if(lot/如果 算出的交易量小于0.1手,則 取交易量為0.1手
    return(lot);//返回(下單量)
    }
    //+------------------------------------------------------------------+
    //| Check for open order conditions
    //自定義函數(無返回值)? ? 開倉策略? ?? ?? ?|
    //+------------------------------------------------------------------+
    void CheckForOpen()//開倉檢查(判斷開倉條件及其處理)
    {
    double ma; //定義局部變量ma為小數型
    int res;? ? //定義局部變量res為整數型
    //---- go trading only for first tiks of new bar,
    //只有在新K線的首次報價時執行
    if(Volume[0]>1) return;
    //如果當前K線的成交價次數大于1時,返回
    (不是K線的開盤時間點,即當前k線還沒收盤確定,則直接返回;否則,如果是K線第一個成交價,則向下繼續運行)
    //---- get Moving Average –獲取均線數值
    ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
    //獲取當前以收盤價為基準計算出的均線數值
    ??iMA(NULL,0,12,6,MOD_SMA,PRICE_CLOSE,0)
    //---- sell conditions-賣出條件
    if(Open[1]>ma && Close[1]//如果前1根K線下穿均線(即K線的開盤價大于均線值、收盤價小于均線值)
    {
    res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
    //發送倉單(當前貨幣對,賣出方向,開倉量計算(),買價,滑點=3,無止損,無止贏,訂單編號,標上紅色箭頭)
    return; //返回
    }
    //---- buy conditions-買入條件
    if(Open[1]ma)
    //如果前1根K線上穿均線(即K線的開盤價小于均線值、收盤價大于均線值)
    {
    res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
    //發送倉單(當前貨幣對,買入方向,開倉量計算(),賣價,滑點=3,無止損,無止贏,訂單編號,標上藍色箭頭)
    return;//返回
    }
    //----
    }
    //+------------------------------------------------------------------+
    //| Check for close order conditions
    //自定義函數(無返回值)? ? 平倉策略? ?? ?? ?|
    //+------------------------------------------------------------------+
    void CheckForClose()//平倉檢查(判斷平倉條件及其處理)
    {
    double ma;//定義局部變量ma小數型
    //---- 只在一個k收盤另一個新出現時交易
    if(Volume[0]>1) return;//如果當前K線的成交價次數>1時,則返回
    //---- get Moving Average //獲取均線數值
    ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
    //獲取當前以收盤價為基準計算出的均線數值
    for(int i=0;i{
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
    //如果 沒有本系統所交易的倉單時,跳出循環
    if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
    //如果 倉單編號不是本系統編號,或者 倉單貨幣對不是當前貨幣對時,繼續選擇
    if(OrderType()==OP_BUY)
    //如果是多單
    {
    if(Open[1]>ma && Close[1]//如果第1根K線開盤價下穿均線時(即開盤價高于均價而收盤價低于均價時),
    則進行多頭平倉(倉單編號,持倉數量,買價,滑點=3,用白色箭頭顯示)
    break;//跳出循環
    }
    if(OrderType()==OP_SELL)
    //如果是空單
    {
    if(Open[1]ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White););
    //如果第1根K線開盤價上穿均線時(即開盤價低于均價而收盤價高于均價時),
    則進行空頭平倉(倉單編號,持倉數量,賣價,滑點=3,用白色箭頭顯示)
    break;//跳出循環
    }
    }
    //----
    }
    //+------------------------------------------------------------------+
    //| Start function? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? |
    //+------------------------------------------------------------------+
    void start()//主程序—-每次成交價所驅動的運算過程
    {
    //---- check for history and trading—對交易歷史進行檢查
    if(Bars//如果K線數少于100根,或者 如果允許智能交易交易=假時,返回
    //---- calculate open orders by current symbol-計算當前貨幣對的開倉訂單
    if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
    //如果 計算出當前貨幣對開倉訂單數=0 (即沒有倉單),則進行開倉檢查。
    else??CheckForClose();
    //否則(即當前已經有倉單時),則進行平倉檢查。
    //----
    }

    二、本EA策略分析
    根據本EA系統的源代碼可以分析出:它使用的策略如下:
    1、技術指標:12周期均線系統;
    2、滑點數:3個點;
    3、開平倉法則:K線上穿均線時,無倉,則開多倉;有空倉時,則平空倉;
    ? ?? ?? ?? ?? ?K線下穿均線時,無倉,則開空倉;有多倉時,則平多倉。
    4、圖上標識:開多倉時,在圖中標示紅色箭頭;平倉時,則標示白色箭頭;
    ? ?? ?? ?? ? 開空倉時,在圖中標未藍色箭頭;平倉時,則標示白色箭頭。

    三、該系統在模擬交易中的結果分析
    以上對該EA系統進行了詳細的解析,從中可以看出EA系統的基本結構與相關策略。下面是該EA在模擬盤中1分鐘K線圖EURUSD(歐元對美元)中的開倉、平倉結果圖。
    在該系統的模擬交易過程中,基本上體現了本策略的操作思想,其中四個下單中,兩個空單和兩個多單,如下圖所示。

    MT4自帶EA(MA)源碼解析來源:外匯邦

    本文名稱:《MT4自帶EA(MA)源碼解析》
    本文鏈接:http://www.wuhansb.com/tuijian/30760.html
    免責聲明:投資有風險!入市需謹慎!本站內容均由用戶自發貢獻,或整編自互聯網,或AI編輯完成,因此對于內容真實性不能作任何類型的保證!請自行判斷內容真假!但是如您發現有涉嫌:抄襲侵權、違法違規、疑似詐騙、虛假不良等內容,請通過底部“聯系&建議”通道,及時與本站聯系,本站始終秉持積極配合態度處理各類問題,因此在收到郵件后,必會刪除相應內容!另外,如需做其他配合工作,如:設置相關詞匯屏蔽等,均可配合完成,以防止后續出現此類內容。生活不易,還請手下留情!由衷希望大家能多多理解,在此先謝過大家了~

    我要說說 搶沙發

    評論前必須登錄!

    立即登錄   注冊

    切換注冊

    登錄

    忘記密碼 ?

    切換登錄

    注冊

    我們將發送一封驗證郵件至你的郵箱, 請正確填寫以完成賬號注冊和激活

    簧色带三级