目前分類:和我一起學EA自動智能交易系統 (12)

瀏覽方式: 標題列表 簡短摘要

一般MT4上所提供的標準分鐘圖,有1分、5分、15分、30分.....等等

如何增加2分鐘,或者10分鐘,甚至2小時等,任何分鐘圖都能增加~~~

我以2分鐘,和10分鐘為範例作說明:

一、先下載

  下載 realtime.ex4 到C:\Program Files\MetaTrader 4\experts\indicators



二、添加分鐘圖流程

  重新打開MT4,由於我們要加入2分鐘圖,必須利用M1分鐘圖作為『背景』,才能顯示

出來,而且之後也要同時開M1,M2才會跟著作更新。

若要加入10分(M10)圖,則要打開M5(若M5不行,有時需要M1);若要加入2小時(H2),就要使用H1為『基底』

由於我們已經將realtime放在indicateors中了,所以可以在自【定義指標】中找到realtime

 

文章標籤

GoForTrading 發表在 痞客邦 留言(0) 人氣()


EA 即Expert Advisors 的英文縮寫,中文意思專家顧問,俗稱智能交易系統,就是由電腦模擬交易員的下單操作進行機器自動交易的過程。一、人工操盤過程下面我們就以MT4外匯客戶端為例,首先來分析一個外匯交易員手工進行外匯交易的操作過程:其步驟如下:1.打開外匯交易客戶端,選定一種貨幣對圖表;2。監視該貨幣對的K線趨勢圖,俗稱盯盤,尋找開倉或者是平倉的時機,即開倉或者是平倉的條件3。如果條件滿足,進行下單開倉(做多或者做空)或者平倉4。重複第二步,繼續盯盤,假定第二步是開倉,就是尋找平倉的條件。5。如果平倉的條件滿足,進行平倉操作,計算盈虧核算。完成一次交易的循環。6。若繼續交易,重複2->3->4->5步7。若不進行交易,退出外匯客戶端。
二、機器操盤過程基於以上的分析,我們已經知道一個完整的智能交易系統(俗稱EA)在運行後必須要實現的基本功能,就是上述的人工操作的1-5步。這也就是智能交易系統的基本工作過程,所以智能交易系統的工作原理就是由程序員借助一門計算機程序設計語言,通過編寫程序交易指令模擬人類交易員的行為進行下單操作,實現機器自動進行交易的過程。主要執行過程可分為:盯盤->開倉->再盯盤->平倉,如此循環執行的過程。關於支持機器自動交易的平台,目前外匯市場上流行的就是MetaQuotes公司的MT4平台,由於這個平台中嵌入了一種MQL4語言,它提供了對服務器端的數據訪問並可進行交易操作的接口,程序交易者可以根據自己的交易策略來編寫自己的自動交易系統,從而實現讓機器自動交易,既可以減輕人類的工作量,又可以克服人類交易中的一此性格弱點,但目前的EA開發,尚所早期起步階段,有的還存在缺陷,但相信隨著技術的發展,機器自動交易終將會逐步取代人類的手工操作。屆時會給交易者一項新的選擇。三、相關MQL語言知識:為了實現機器操作,再來看看所需的MQL4語言的相關知識:1.掌握MQL4語言的基本語法和程序的構成,及運行流程有關語法部分,請讀者參看相關的資料,這里略去。關於程序的構成,對於一個智能交易系統EA程序來說:主要由三個函數構成分別是:init():初始化函數,負責程序變量及數據初始輸入;只在程序調入時執行一次,一般不用重寫內容。deinit():反初始化函數,負責程序退出時,將數據從內存中清除;只在程序退出時,執行一次,一般不用重寫內容。start():開始函數,也即程序的主函數,負責EA程序的全部交易執行過程,實際上他是一個EA的交易管理與執行函數。每隔一定時間,一般幾秒之內,執行一次,就是循環執行,起到程序退出時終止運行流程:啟動EA後,程序的INTI()開始執行一次,-->然後START()循環執行--->最後退出EA時deinit()執行一次2。 mql4中與交易相關的交易函數:開倉函數:int OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, void comment, void magic, void expiration, void arrow_color)這個功能主要應用於開倉位置和掛單交易.參量:symbol - 交易貨幣對。cmd - 購買方式。volume - 購買手數。price - 收盤價格。slippage - 最大允許滑點數。stoploss - 止損水平。takeprofit - 贏利水平。comment - 註解文本。magic - 定單指定碼。可以作為用戶指定識別碼使用。expiration - 定單有效時間(只限掛單)。arrow_color - 圖表上箭頭顏色。如果參量丟失或存在CLR_NONE價格值不會在圖表中畫出平倉函數:bool OrderClose( int ticket, double lots, double price, int slippage, void Color)對定單進行平倉操作。如果函數成功,返回的值是真實的。如果函數失敗,返回的值是假的。獲得詳細錯誤信息,請查看GetLastError()函數。參量:ticket - 定單編號。lots - 手數。price - 收盤價格。slippage - 最高劃點數。Color - 圖表中標記顏色。如果參量丟失,CLR_NONE值將不會在圖表中畫出。定單修改函數:bool OrderModify( int ticket, double price, double stoploss, double takeprofit, datetime expiration, void arrow_color)對於先前的開倉或掛單進行特性修改。如果函數成功,返回的值為 TRUE。如果函數失敗,返回的值為FALSE。獲得詳細的錯誤信息,查看GetLastError()函數。參量:ticket - 定單編號。price - 收盤價格stoploss - 新止損水平。takeprofit - 新贏利水平。expiration - 掛單有效時間。arrow_color - 在圖表中允許對止損/贏利顏色進行修改。如果參量丟失或存在CLR_NONE 值,在圖表中將不會顯示。
資料來源:
外匯學堂

ETF 是什麼/ ETF 怎麼買・股利 ETF

Firstrade 第一證券 提供了超過1000 多檔免交易手續費 ETF 可選擇

如何$0元手續費購買美股ETF......美股券商Firstrade (第一證券)

(2023 最新優惠活動詳閱Firstrade官網)

【2023 美股投資】重磅!美股券商第一證券(Firstrade)推出0佣金優惠+ 400美元現金獎勵(Firstrade(第一證券)八大優勢!)

【2023 美股投資】重磅再出擊~美股券商Firstrade (第一證券)大幅下調交易傭金至$0 (2018.8.23 零傭金交易($ 0 美金)時代)

1.免佣金($0美元)超過2200支以上

2.獲晨星星級評分數量超過1100支以上

3.ETF供應商數量100家

 

【2023 外匯交易】英國最佳2大外匯經紀商實時點差比較(LMAX vs. Darwinex) 700+ 免傭金ETFs

Skrill電子錢包 免費轉賬

Skrill電子錢包 匯款至境外銀行賬戶時將免收轉賬手續費

Skrill電子錢包 線上交易加密貨幣

【2023 挖礦BTC實錄CryptoTab】利用部落格/網站.網頁.手機挖礦賺爆美金(Referrals介紹下線賺更快)

【2023 外匯交易】英國最佳2大外匯經紀商實時點差比較(LMAX vs. Darwinex)

【2023 外匯交易】五點理由,你為什麼應該與英國FCA監管的外匯經紀商進行交易

1527161489-2353636118.jpg

【2023 外匯交易】IC Markets,全球最大ECN/世界第一家真正ECN(什麼是真正的True ECN)

ICMarkets.jpg

aa3e7da9ca03cac7d7f7c020e678268b.jpg

最新老虎證券(Tiger Brokers)優惠請詳閱--->最新優惠活動

【2023 AMP Futures 介紹&開戶流程完整全攻略(含圖解)】/【美國(海)外期貨開戶操作交易】

amp-futures.png

【2023 DeepDiscountTrading開戶流程完整介紹全攻略】【圖解流程】/【史上最便宜海外期貨手續費.最低保證金】/【國外期貨選擇權開戶交易】

deepdiscounttrading(logo).jpg

內容僅供參考,本網站不涉及任何經營和推薦,所有內容皆可在網路和官網搜尋並找到資料,投資前請謹慎評估,本人不負任何責任 免責聲明 » 凡本網站註明來源網絡或其他網站,均為轉載稿,本網轉載出於傳遞更多信息之目的,並不意味著贊同其觀點或證實其內容的真實性,也不構成任何投資建議。對於訪問者根據本網站提供的信息所做出的一切行為,本網站不承擔任何形式的責任。本網站僅提供經濟信息,並僅供參考;亦不提供證券、基金、銀行、保險、金融任何業務與服務;不推薦任何相關商品和服務;不與任何人簽署任何海外證券投資協議,不進行海外金融產品交易,不接受任何人投資資金。

GoForTrading 發表在 痞客邦 留言(0) 人氣()

對於程式語言一直抱持排斥的心態,所以無法好好地靜下心學好

 

交易已經進展到『程式自動交易』非走不可的階段,看看如何能快速又簡單進入

 

先來學習別人的,多看並利用一些好工具,來簡化學習的曲線

 

//+------------------------------------------------------------------+
//| 

                                              Moving Average.mq4 |                                                                                                                                           
//|                                                    http://www.imt4.com |
//+------------------------------------------------------------------+
#define MAGICMA  20050610

extern double Lots                            = 0.1;
extern double MaximumRisk              = 0.02;
extern double DecreaseFactor        = 3;
extern double MovingPeriod            = 10;
extern double MovingShift              =3;
//+------------------------------------------------------------------+
//| Calculate open positions                                                                                |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
    int buys=0,sells=0;
//----
    for(int i=0;i<OrdersTotal();i++)
        {
          if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
          if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
              {
                if(OrderType()==OP_BUY)  buys++;
                if(OrderType()==OP_SELL) sells++;
              }
        }
//---- return orders volume
    if(buys>0) return(buys);
    else            return(-sells);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                                                            |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
    double lot=Lots;
    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);
//---- calcuulate number of losses orders without a break
    if(DecreaseFactor>0)
        {
          for(int i=orders-1;i>=0;i--)
              {
                if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
                if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
                //----
                if(OrderProfit()>0) break;
                if(OrderProfit()<0) losses++;
              }
          if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
        }
//---- return lot size
    if(lot<0.1) lot=0.1;
    return(lot);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
    double ma;
    int      res;
//---- go trading only for first tiks of new bar
    if(Volume[0]>1) return;
//---- get Moving Average
    ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//---- sell conditions
    if(Open[1]>ma && Close[1]<ma) 
        {
          res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
          return;
        }
//---- buy conditions
    if(Open[1]<ma && Close[1]>ma) 
        {
          res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
          return;
        }
//----
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                                                |
//+------------------------------------------------------------------+
void CheckForClose()
  {
    double ma;
//---- go trading only for first tiks of new bar
    if(Volume[0]>1) return;
//---- get Moving Average
    ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//----
    for(int i=0;i<OrdersTotal();i++)
        {
          if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)              break;
          if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
          //---- check order type
          if(OrderType()==OP_BUY)
              {
                if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
                break;
              }
          if(OrderType()==OP_SELL)
              {
                if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
                break;
              }
        }
//----
  }
//+------------------------------------------------------------------+
//| Start function                                                                                                    |
//+------------------------------------------------------------------+
void start()
  {
//---- check for history and trading
    if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
    if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
    else                                                                      CheckForClose();
//----
  }
//+------------------------------------------------------------------+

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
以下是註解

//+------------------------------------------------------------------+
//|                                                                          Moving Average.mq4 |                                       
//|                                                                            http://www.imt4.com |
//+------------------------------------------------------------------+
#define MAGICMA  20050610 //定義本EA操作的訂單的唯一標識號碼

extern double Lots                            = 0.1;//每單的交易量
extern double MaximumRisk              = 0.02;//作者定義的最大風險參數
extern double DecreaseFactor        = 3;//作者定義的參數,作用要看程序中的用法
extern double MovingPeriod            = 10;//EA中使用的均線的周期
extern double MovingShift              =3;//EA中使用的均線向左的K線偏移量
//+------------------------------------------------------------------+
//| Calculate open positions                                                                                |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)//函數作用,計算當前持倉訂單的數量
  {
    int buys=0,sells=0;//定義兩個臨時變量,準備用於後面的多空訂單的個數計算
//----
    for(int i=0;i<OrdersTotal();i++)//循環檢測當前的訂單隊列
        {
          if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;//挑出持倉單的每一個訂單位置
          if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)//根據訂單位置,比較是否是當前K線商品以及訂單唯一標識號是否和本程序設置的一致(用於避 免EA誤操作其他程序控制的持倉單)
              {
                if(OrderType()==OP_BUY)  buys++;//找到符合條件的持倉單後,如果是多單,則臨時變量buys增加1
                if(OrderType()==OP_SELL) sells++;//找到符合條件的持倉單後,如果是空單,則臨時變量sells增加1
              }
        }
//---- return orders volume
    if(buys>0) return(buys);
    else            return(-sells);//本函數返回查詢計算結束時的持倉單的個數。
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                                                            |
//+------------------------------------------------------------------+
double LotsOptimized()//函數目的,根據要求 計算出訂單交易量
  {
    double lot=Lots;
    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);//通過風險系數的計算獲得當前入場單應該采用的交易量
//---- calcuulate number of losses orders without a break
    if(DecreaseFactor>0)
        {
          for(int i=orders-1;i>=0;i--)
              {
                if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }//循環查詢出場單隊列
                if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;//
                //----
                if(OrderProfit()>0) break;
                if(OrderProfit()<0) losses++;//循環計算所有出場虧損單的虧損總和
              }
          if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);//如果虧損額大於1,則下一入場單的交易量修正為新的計算結果。
        }
//---- return lot size
    if(lot<0.1) lot=0.1;//如果計算出的交易量小於帳戶最小手數0.1,則下一入場單的交易手數使用0.1作為交易量
    return(lot);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                                                  |
//+------------------------------------------------------------------+
void CheckForOpen()//檢查入場條件的情況並作處理
  {
    double ma;
    int      res;
//---- go trading only for first tiks of new bar
    if(Volume[0]>1) return;//如果當前K線持倉量大於1,說明不是K線的開盤時間點,則直接返回 否則是K線第一個價格,則繼續下面的過程
//---- get Moving Average
    ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);//獲得當前的均線數值
//---- sell conditions
    if(Open[1]>ma && Close[1]<ma)  //如當前K開盤價大於均線,而前一K收盤價小於均線,則發出入場多單
        {
          res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
          return;
        }
//---- buy conditions
    if(Open[1]<ma && Close[1]>ma)  //如當前K開盤價小於均線,而前一K收盤價大於均線,則發出入場空單
        {
          res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
          return;
        }
//----
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                                                |
//+------------------------------------------------------------------+
void CheckForClose()//檢查出場條件的情況並作處理
  {
    double ma;
//---- go trading only for first tiks of new bar
    if(Volume[0]>1) return;
//---- get Moving Average
    ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//----
    for(int i=0;i<OrdersTotal();i++)
        {
          if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)              break;
          if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
          //---- check order type
          if(OrderType()==OP_BUY)
              {
                if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);//如果持倉是多單,則當當前K開盤價小於均 線,而前一K收盤價大於均線,則發出平倉指令
                break;
              }
          if(OrderType()==OP_SELL)
              {
                if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White););//如果持倉是空單,則當當前K開盤價大於 均線,而前一K收盤價小於均線,則發出平倉指令

 

              break;
              }
        }
//----
  }
//+------------------------------------------------------------------+
//| Start function                                                                                                    |
//+------------------------------------------------------------------+
void start()//主循環過程
  {
//---- check for history and trading
    if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
    if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
    else                                                                      CheckForClose();
//----
  }
//+------------------------------------------------------------------+

ETF 是什麼/ ETF 怎麼買・股利 ETF

Firstrade 第一證券 提供了超過1000 多檔免交易手續費 ETF 可選擇

如何$0元手續費購買美股ETF......美股券商Firstrade (第一證券)

(2023 最新優惠活動詳閱Firstrade官網)

【2023 美股投資】重磅!美股券商第一證券(Firstrade)推出0佣金優惠+ 400美元現金獎勵(Firstrade(第一證券)八大優勢!)

【2023 美股投資】重磅再出擊~美股券商Firstrade (第一證券)大幅下調交易傭金至$0 (2018.8.23 零傭金交易($ 0 美金)時代)

1.免佣金($0美元)超過2200支以上

2.獲晨星星級評分數量超過1100支以上

3.ETF供應商數量100家

 

【2023 外匯交易】英國最佳2大外匯經紀商實時點差比較(LMAX vs. Darwinex) 700+ 免傭金ETFs

Skrill電子錢包 免費轉賬

Skrill電子錢包 匯款至境外銀行賬戶時將免收轉賬手續費

Skrill電子錢包 線上交易加密貨幣

【2023 挖礦BTC實錄CryptoTab】利用部落格/網站.網頁.手機挖礦賺爆美金(Referrals介紹下線賺更快)

【2023 外匯交易】英國最佳2大外匯經紀商實時點差比較(LMAX vs. Darwinex)

【2023 外匯交易】五點理由,你為什麼應該與英國FCA監管的外匯經紀商進行交易

1527161489-2353636118.jpg

【2023 外匯交易】IC Markets,全球最大ECN/世界第一家真正ECN(什麼是真正的True ECN)

ICMarkets.jpg

aa3e7da9ca03cac7d7f7c020e678268b.jpg

最新老虎證券(Tiger Brokers)優惠請詳閱--->最新優惠活動

【2023 AMP Futures 介紹&開戶流程完整全攻略(含圖解)】/【美國(海)外期貨開戶操作交易】

amp-futures.png

【2023 DeepDiscountTrading開戶流程完整介紹全攻略】【圖解流程】/【史上最便宜海外期貨手續費.最低保證金】/【國外期貨選擇權開戶交易】

deepdiscounttrading(logo).jpg

內容僅供參考,本網站不涉及任何經營和推薦,所有內容皆可在網路和官網搜尋並找到資料,投資前請謹慎評估,本人不負任何責任 免責聲明 » 凡本網站註明來源網絡或其他網站,均為轉載稿,本網轉載出於傳遞更多信息之目的,並不意味著贊同其觀點或證實其內容的真實性,也不構成任何投資建議。對於訪問者根據本網站提供的信息所做出的一切行為,本網站不承擔任何形式的責任。本網站僅提供經濟信息,並僅供參考;亦不提供證券、基金、銀行、保險、金融任何業務與服務;不推薦任何相關商品和服務;不與任何人簽署任何海外證券投資協議,不進行海外金融產品交易,不接受任何人投資資金。

文章標籤

GoForTrading 發表在 痞客邦 留言(0) 人氣()

【myEAtrade】http://www.myeatrade.com/zh

太~~~~~棒了

在這個網站裡,將條件輸入後,就能自動產生EA了!!

而且還有很多關於EA(智能交易系統)的教學以及社群可以討論交流。

趕緊快來使用吧!!!

【myEAtrade】是什麼?myEAtrade是一款在線工具,不需要編程可以自動為你生成用於在金融市場上進行外匯,黃金,期貨程序化交易(自動交易,外匯EA)的源代碼。支持各大主流外匯保證金交易平台,可以生成MetaTrader 4(MT4),MetaTrader 5(MT5),JForex等各外匯交易平台下的程序化交易(自動交易、外匯EA)的源代碼。myEAtrade如何幫助你?這裡只是幾個例子使用myEAtrade你將獲得什麼幫助:

    
使用簡單方便,沒有復雜的編程技巧和術語,不需​​寫任何代碼,如果你喜歡程序化交易(自動化交易,外匯EA),但苦於不懂編程,這將是你最好的伙伴
    
幾分鐘之內迅速將你的交易想法和策略轉換為程序化交易系統(外匯EA),節省你大量的時間和金錢去尋找一名程序員幫你編程
    
如果你不喜歡自​​動交易或是新手,myEAtrade也可以幫助你,通過生成大量程序化交易系統(外匯EA)對其進行歷史測試​​觀察學習,​​有助於你驗證、完善、發展自己的交易策略實現穩定盈利

    生成的自動交易系統(外匯EA等),也可以實現聲音預警,交易信號通過電子郵件發送到你移動設備等功能,手工下單,減少你大量的盯盤時間和壓力
    
保護你的交易秘密,不需要向任何人分享你的策略就可以完成程序化交易系統(外匯EA)的實現(myEAtrade如何保護你的隱私)一些特性
Some Features
    
可以使用技術指標,K線組合等為你程序化交易系統(外匯EA)創建你的交易規則(交易條件)
    
支持各種技術指標擴展,支持自己添加自定義指標,所以可在你的程序化交易系統(外匯EA)裡使用任何技術指標
    
可以實現基於多品種、多時間週期框架的複雜交易系統,也可開發基於多品種的對沖交易系統(對沖外匯EA等)
    
生成程序化交易系統(外匯EA)可以支持技術指標過濾,時間過濾,資金管理,移動止損,技術止損,資金保護,martingale加倉,多種加倉方式,兼容ECN等功能
    
交易策略可以轉換為信號,通過聲音或email進行提醒如何工作的?不用下載文件,不用安裝,也沒有復雜的配置。通過先進的算法和規則引擎系統,每次生成的程序化交易系統(外匯EA)的源代碼都是正確的並且生成的代碼執行效率也是非常高效。


文章標籤

GoForTrading 發表在 痞客邦 留言(0) 人氣()

對於程式語言一直抱持排斥的心態,所以無法好好地靜下心學好

交易已經進展到『程式自動交易』非走不可的階段,看看如何能快速又簡單進入

先來學習別人的,多看並利用一些好工具,來簡化學習的曲線

//+------------------------------------------------------------------+
//|
                        Moving Average.mq4 |                                                                      
//|                           http://www.imt4.com |
//+------------------------------------------------------------------+
#define MAGICMA  20050610
extern double Lots               = 0.1;
extern double MaximumRisk        = 0.02;
extern double DecreaseFactor     = 3;
extern double MovingPeriod       = 10;
extern double MovingShift        =3;
//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//---- return orders volume
   if(buys>0) return(buys);

   else       return(-sells);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
   double lot=Lots;
   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);
//---- calcuulate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
         //----
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;
        }
      if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
//---- return lot size
   if(lot<0.1) lot=0.1;
   return(lot);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double ma;
   int    res;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//---- sell conditions
   if(Open[1]>ma && Close[1]<ma) 
     {
      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
      return;
     }
//---- buy conditions
   if(Open[1]<ma && Close[1]>ma) 
     {
      res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
      return;
     }
//----
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
  {
   double ma;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //---- check order type
      if(OrderType()==OP_BUY)
        {
         if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
         break;
        }
     }
//----
  }
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()
  {
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//----
  }
//+------------------------------------------------------------------+
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
以下是註解
//+------------------------------------------------------------------+
//|                                      Moving Average.mq4 |                    
//|                                       http://www.imt4.com |
//+------------------------------------------------------------------+
#define MAGICMA  20050610 //定義本EA操作的訂單的唯一標識號碼
extern double Lots               = 0.1;//每單的交易量
extern double MaximumRisk        = 0.02;//作者定義的最大風險參數
extern double DecreaseFactor     = 3;//作者定義的參數,作用要看程序中的用法
extern double MovingPeriod       = 10;//EA中使用的均線的周期
extern double MovingShift        =3;//EA中使用的均線向左的K線偏移量
//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)//函數作用,計算當前持倉訂單的數量
  {
   int buys=0,sells=0;//定義兩個臨時變量,準備用於後面的多空訂單的個數計算
//----
   for(int i=0;i<OrdersTotal();i++)//循環檢測當前的訂單隊列
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;//挑出持倉單的每一個訂單位置
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)//根據訂單位置,比較是否是當前K線商品以及訂單唯一標識號是否和本程序設置的一致(用於避免EA誤操作其他程序控制的持倉單)
        {
         if(OrderType()==OP_BUY)  buys++;//找到符合條件的持倉單後,如果是多單,則臨時變量buys增加1
         if(OrderType()==OP_SELL) sells++;//找到符合條件的持倉單後,如果是空單,則臨時變量sells增加1
        }
     }
//---- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);//本函數返回查詢計算結束時的持倉單的個數。
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double LotsOptimized()//函數目的,根據要求 計算出訂單交易量
  {
   double lot=Lots;
   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);//通過風險系數的計算獲得當前入場單應該采用的交易量
//---- calcuulate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }//循環查詢出場單隊列
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;//
         //----
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;//循環計算所有出場虧損單的虧損總和
        }
      if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);//如果虧損額大於1,則下一入場單的交易量修正為新的計算結果。
     }
//---- return lot size
   if(lot<0.1) lot=0.1;//如果計算出的交易量小於帳戶最小手數0.1,則下一入場單的交易手數使用0.1作為交易量
   return(lot);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()//檢查入場條件的情況並作處理
  {
   double ma;
   int    res;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;//如果當前K線持倉量大於1,說明不是K線的開盤時間點,則直接返回 否則是K線第一個價格,則繼續下面的過程
//---- get Moving Average
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);//獲得當前的均線數值
//---- sell conditions
   if(Open[1]>ma && Close[1]<ma)  //如當前K開盤價大於均線,而前一K收盤價小於均線,則發出入場多單
     {
      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
      return;
     }
//---- buy conditions
   if(Open[1]<ma && Close[1]>ma)  //如當前K開盤價小於均線,而前一K收盤價大於均線,則發出入場空單
     {
      res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
      return;
     }
//----
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()//檢查出場條件的情況並作處理
  {
   double ma;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //---- check order type
      if(OrderType()==OP_BUY)
        {
         if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);//如果持倉是多單,則當當前K開盤價小於均 線,而前一K收盤價大於均線,則發出平倉指令
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White););//如果持倉是空單,則當當前K開盤價大於 均線,而前一K收盤價小於均線,則發出平倉指令
         break;
        }
     }
//----
  }
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()//主循環過程
  {
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//----
  }
//+------------------------------------------------------------------+

GoForTrading 發表在 痞客邦 留言(0) 人氣()

所有的程序就是對數據進行操作,我們根據不同的需求對數據定義不同的類型,比如數字類型的數據用於操作數組。價格數據使用浮點型類型數據,MQL本身沒有貨幣類型的數據類型。

不同的數據類型有著不同的處理速度,其中整數處理的最快,double類型的需要特殊處理,所以比整形要慢,string也就是字符串類型處理起來最慢,因為處理字符串需要動態的分配和釋放內存,對內存的操作比較頻繁。

以下是常用的數據類型

1)int,整數,它就是我們常見的整數,入1,-100,908等等。它的範圍為

-2147483648 to 2147483647,如果超出這個範圍,則會程序會提示異常。

2)bool,布爾型。它的值只有兩個,true或false。 Bool型其實就是個int類型,不過它的值被限定為1:true和0:false。例如:

bool a = true;

bool b = 0; //b的值為false

3)char, 字符型:它的內部也是int型,範圍為0到255。如果超過這個範圍,則程序會提示異常。我們不直接使用char,而是使用int,如:

int a = 'a';

int b = 'c';

4)string 字符型,字符型可以保存字符串如:

string a = "這是一個字符串";

5)double 浮點型,用於保存含有小數的數字如:

double a = "1.23";

double b = "-90.98";

6)color 顏色類型,顏色類型的內部實現,其實也是一個int型。

7)datetime 時間類型,時間類型的內部其實也是個int型,它的實際值為1970-1-1到指定時間的秒數。時間類型的賦值如:

datetime d = D'2010.1.1 12:3:4'

datetime c = D'2010.2.3 3:56';

文章標籤

GoForTrading 發表在 痞客邦 留言(0) 人氣()


所有的程序就是對數據進行操作,我們根據不同的需求對數據定義不同的類型,比如數字類型的數據用於操作數組。價格數據使用浮點型類型數據,MQL本身沒有貨幣類型的數據類型。不同的數據類型有著不同的處理速度,其中整數處理的最快,double類型的需要特殊處理,所以比整形要慢,string也就是字符串類型處理起來最慢,因為處理字符串需要動態的分配和釋放內存,對內存的操作比較頻繁。以下是常用的數據類型1)int,整數,它就是我們常見的整數,入1,-100,908等等。它的範圍為-2147483648 to 2147483647,如果超出這個範圍,則會程序會提示異常。2)bool,布爾型。它的值只有兩個,true或false。 Bool型其實就是個int類型,不過它的值被限定為1:true和0:false。例如:bool a = true;bool b = 0; //b的值為false3)char, 字符型:它的內部也是int型,範圍為0到255。如果超過這個範圍,則程序會提示異常。我們不直接使用char,而是使用int,如:int a = 'a';int b = 'c';
4)string 字符型,字符型可以保存字符串如:string a = "這是一個字符串";5)double 浮點型,用於保存含有小數的數字如:double a = "1.23";double b = "-90.98";6)color 顏色類型,顏色類型的內部實現,其實也是一個int型。7)datetime 時間類型,時間類型的內部其實也是個int型,它的實際值為1970-1-1到指定時間的秒數。時間類型的賦值如:datetime d = D'2010.1.1 12:3:4'datetime c = D'2010.2.3 3:56';

GoForTrading 發表在 痞客邦 留言(0) 人氣()

對於程式語言一直抱持排斥的心態,所以無法好好地靜下心學好

交易已經進展到『程式自動交易』非走不可的階段,看看如何能快速又簡單進入

先來學習別人的,多看並利用一些好工具,來簡化學習的曲線

//+------------------------------------------------------------------+
//|
                        Moving Average.mq4 |                                                                      
//|                           http://www.imt4.com |
//+------------------------------------------------------------------+

#define MAGICMA  20050610
extern double Lots               = 0.1;
extern double MaximumRisk        = 0.02;
extern double DecreaseFactor     = 3;
extern double MovingPeriod       = 10;
extern double MovingShift        =3;
//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//---- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
   double lot=Lots;
   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);
//---- calcuulate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
         //----
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;
        }
      if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
//---- return lot size
   if(lot<0.1) lot=0.1;
   return(lot);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double ma;
   int    res;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//---- sell conditions
   if(Open[1]>ma && Close[1]<ma) 
     {
      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
      return;
     }
//---- buy conditions
   if(Open[1]<ma && Close[1]>ma) 
     {
      res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
      return;
     }
//----
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
  {
   double ma;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //---- check order type
      if(OrderType()==OP_BUY)
        {
         if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
         break;
        }
     }
//----
  }
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()
  {
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//----
  }
//+------------------------------------------------------------------+
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
以下是註解
//+------------------------------------------------------------------+
//|                                      Moving Average.mq4 |                    
//|                                       http://www.imt4.com |
//+------------------------------------------------------------------+
#define MAGICMA  20050610 //定義本EA操作的訂單的唯一標識號碼
extern double Lots               = 0.1;//每單的交易量
extern double MaximumRisk        = 0.02;//作者定義的最大風險參數
extern double DecreaseFactor     = 3;//作者定義的參數,作用要看程序中的用法
extern double MovingPeriod       = 10;//EA中使用的均線的周期
extern double MovingShift        =3;//EA中使用的均線向左的K線偏移量
//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)//函數作用,計算當前持倉訂單的數量
  {
   int buys=0,sells=0;//定義兩個臨時變量,準備用於後面的多空訂單的個數計算
//----
   for(int i=0;i<OrdersTotal();i++)//循環檢測當前的訂單隊列
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;//挑出持倉單的每一個訂單位置
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)//根據訂單位置,比較是否是當前K線商品以及訂單唯一標識號是否和本程序設置的一致(用於避免EA誤操作其他程序控制的持倉單)
        {
         if(OrderType()==OP_BUY)  buys++;//找到符合條件的持倉單後,如果是多單,則臨時變量buys增加1
         if(OrderType()==OP_SELL) sells++;//找到符合條件的持倉單後,如果是空單,則臨時變量sells增加1
        }
     }
//---- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);//本函數返回查詢計算結束時的持倉單的個數。
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double LotsOptimized()//函數目的,根據要求 計算出訂單交易量
  {
   double lot=Lots;
   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);//通過風險系數的計算獲得當前入場單應該采用的交易量
//---- calcuulate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }//循環查詢出場單隊列
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;//
         //----
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;//循環計算所有出場虧損單的虧損總和
        }
      if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);//如果虧損額大於1,則下一入場單的交易量修正為新的計算結果。
     }
//---- return lot size
   if(lot<0.1) lot=0.1;//如果計算出的交易量小於帳戶最小手數0.1,則下一入場單的交易手數使用0.1作為交易量
   return(lot);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()//檢查入場條件的情況並作處理
  {
   double ma;
   int    res;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;//如果當前K線持倉量大於1,說明不是K線的開盤時間點,則直接返回 否則是K線第一個價格,則繼續下面的過程
//---- get Moving Average
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);//獲得當前的均線數值
//---- sell conditions
   if(Open[1]>ma && Close[1]<ma)  //如當前K開盤價大於均線,而前一K收盤價小於均線,則發出入場多單
     {
      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
      return;
     }
//---- buy conditions
   if(Open[1]<ma && Close[1]>ma)  //如當前K開盤價小於均線,而前一K收盤價大於均線,則發出入場空單
     {
      res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
      return;
     }
//----
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()//檢查出場條件的情況並作處理
  {
   double ma;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //---- check order type
      if(OrderType()==OP_BUY)
        {
         if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);//如果持倉是多單,則當當前K開盤價小於均 線,而前一K收盤價大於均線,則發出平倉指令
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White););//如果持倉是空單,則當當前K開盤價大於 均線,而前一K收盤價小於均線,則發出平倉指令
         break;
        }
     }
//----
  }
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()//主循環過程
  {
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//----
  }
//+------------------------------------------------------------------+

GoForTrading 發表在 痞客邦 留言(0) 人氣()

對於程式語言一直抱持排斥的心態,所以無法好好地靜下心學好

交易已經進展到『程式自動交易』非走不可的階段,看看如何能快速又簡單進入

先來學習別人的,多看並利用一些好工具,來簡化學習的曲線

//+------------------------------------------------------------------+
//|
                        Moving Average.mq4 |                                                                      
//|                           http://www.imt4.com |
//+------------------------------------------------------------------+
#define MAGICMA  20050610
extern double Lots               = 0.1;
extern double MaximumRisk        = 0.02;
extern double DecreaseFactor     = 3;
extern double MovingPeriod       = 10;
extern double MovingShift        =3;
//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//---- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
   double lot=Lots;
   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);
//---- calcuulate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
         //----
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;
        }
      if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
//---- return lot size
   if(lot<0.1) lot=0.1;
   return(lot);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double ma;
   int    res;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//---- sell conditions
   if(Open[1]>ma && Close[1]<ma) 
     {
      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
      return;
     }
//---- buy conditions
   if(Open[1]<ma && Close[1]>ma) 
     {
      res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
      return;
     }
//----
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
  {
   double ma;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //---- check order type
      if(OrderType()==OP_BUY)
        {
         if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
         break;
        }
     }
//----
  }
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()
  {
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//----
  }
//+------------------------------------------------------------------+
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
以下是註解
//+------------------------------------------------------------------+
//|                                      Moving Average.mq4 |                    
//|                                       http://www.imt4.com |
//+------------------------------------------------------------------+
#define MAGICMA  20050610 //定義本EA操作的訂單的唯一標識號碼
extern double Lots               = 0.1;//每單的交易量
extern double MaximumRisk        = 0.02;//作者定義的最大風險參數
extern double DecreaseFactor     = 3;//作者定義的參數,作用要看程序中的用法
extern double MovingPeriod       = 10;//EA中使用的均線的周期
extern double MovingShift        =3;//EA中使用的均線向左的K線偏移量
//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)//函數作用,計算當前持倉訂單的數量
  {
   int buys=0,sells=0;//定義兩個臨時變量,準備用於後面的多空訂單的個數計算
//----
   for(int i=0;i<OrdersTotal();i++)//循環檢測當前的訂單隊列
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;//挑出持倉單的每一個訂單位置
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)//根據訂單位置,比較是否是當前K線商品以及訂單唯一標識號是否和本程序設置的一致(用於避免EA誤操作其他程序控制的持倉單)
        {
         if(OrderType()==OP_BUY)  buys++;//找到符合條件的持倉單後,如果是多單,則臨時變量buys增加1
         if(OrderType()==OP_SELL) sells++;//找到符合條件的持倉單後,如果是空單,則臨時變量sells增加1
        }
     }
//---- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);//本函數返回查詢計算結束時的持倉單的個數。
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double LotsOptimized()//函數目的,根據要求 計算出訂單交易量
  {
   double lot=Lots;
   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);//通過風險系數的計算獲得當前入場單應該采用的交易量
//---- calcuulate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }//循環查詢出場單隊列
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;//
         //----
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;//循環計算所有出場虧損單的虧損總和
        }
      if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);//如果虧損額大於1,則下一入場單的交易量修正為新的計算結果。
     }
//---- return lot size
   if(lot<0.1) lot=0.1;//如果計算出的交易量小於帳戶最小手數0.1,則下一入場單的交易手數使用0.1作為交易量
   return(lot);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()//檢查入場條件的情況並作處理
  {
   double ma;
   int    res;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;//如果當前K線持倉量大於1,說明不是K線的開盤時間點,則直接返回 否則是K線第一個價格,則繼續下面的過程
//---- get Moving Average
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);//獲得當前的均線數值
//---- sell conditions
   if(Open[1]>ma && Close[1]<ma)  //如當前K開盤價大於均線,而前一K收盤價小於均線,則發出入場多單
     {
      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
      return;
     }
//---- buy conditions
   if(Open[1]<ma && Close[1]>ma)  //如當前K開盤價小於均線,而前一K收盤價大於均線,則發出入場空單
     {
      res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
      return;
     }
//----
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()//檢查出場條件的情況並作處理
  {
   double ma;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //---- check order type
      if(OrderType()==OP_BUY)
        {
         if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);//如果持倉是多單,則當當前K開盤價小於均 線,而前一K收盤價大於均線,則發出平倉指令
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White););//如果持倉是空單,則當當前K開盤價大於 均線,而前一K收盤價小於均線,則發出平倉指令
         break;
        }
     }
//----
  }
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()//主循環過程
  {
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//----
  }
//+------------------------------------------------------------------+

GoForTrading 發表在 痞客邦 留言(0) 人氣()

對於程式語言一直抱持排斥的心態,所以無法好好地靜下心學好

交易已經進展到『程式自動交易』非走不可的階段,看看如何能快速又簡單進入

先來學習別人的,多看並利用一些好工具,來簡化學習的曲線

//+------------------------------------------------------------------+
//|
                        Moving Average.mq4 |                                                                      
//|                           http://www.imt4.com |
//+------------------------------------------------------------------+
#define MAGICMA  20050610
extern double Lots               = 0.1;
extern double MaximumRisk        = 0.02;
extern double DecreaseFactor     = 3;
extern double MovingPeriod       = 10;
extern double MovingShift        =3;

//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//---- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
   double lot=Lots;
   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);
//---- calcuulate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
         //----
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;
        }
      if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
//---- return lot size
   if(lot<0.1) lot=0.1;
   return(lot);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double ma;
   int    res;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//---- sell conditions
   if(Open[1]>ma && Close[1]<ma) 
     {
      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
      return;
     }
//---- buy conditions
   if(Open[1]<ma && Close[1]>ma) 
     {
      res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
      return;
     }
//----
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
  {
   double ma;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //---- check order type
      if(OrderType()==OP_BUY)
        {
         if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
         break;
        }
     }
//----
  }
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()
  {
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//----
  }
//+------------------------------------------------------------------+
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
以下是註解
//+------------------------------------------------------------------+
//|                                      Moving Average.mq4 |                    
//|                                       http://www.imt4.com |
//+------------------------------------------------------------------+
#define MAGICMA  20050610 //定義本EA操作的訂單的唯一標識號碼
extern double Lots               = 0.1;//每單的交易量
extern double MaximumRisk        = 0.02;//作者定義的最大風險參數
extern double DecreaseFactor     = 3;//作者定義的參數,作用要看程序中的用法
extern double MovingPeriod       = 10;//EA中使用的均線的周期
extern double MovingShift        =3;//EA中使用的均線向左的K線偏移量
//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)//函數作用,計算當前持倉訂單的數量
  {
   int buys=0,sells=0;//定義兩個臨時變量,準備用於後面的多空訂單的個數計算
//----
   for(int i=0;i<OrdersTotal();i++)//循環檢測當前的訂單隊列
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;//挑出持倉單的每一個訂單位置
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)//根據訂單位置,比較是否是當前K線商品以及訂單唯一標識號是否和本程序設置的一致(用於避免EA誤操作其他程序控制的持倉單)
        {
         if(OrderType()==OP_BUY)  buys++;//找到符合條件的持倉單後,如果是多單,則臨時變量buys增加1
         if(OrderType()==OP_SELL) sells++;//找到符合條件的持倉單後,如果是空單,則臨時變量sells增加1
        }
     }
//---- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);//本函數返回查詢計算結束時的持倉單的個數。
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double LotsOptimized()//函數目的,根據要求 計算出訂單交易量
  {
   double lot=Lots;
   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);//通過風險系數的計算獲得當前入場單應該采用的交易量
//---- calcuulate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }//循環查詢出場單隊列
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;//
         //----
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;//循環計算所有出場虧損單的虧損總和
        }
      if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);//如果虧損額大於1,則下一入場單的交易量修正為新的計算結果。
     }
//---- return lot size
   if(lot<0.1) lot=0.1;//如果計算出的交易量小於帳戶最小手數0.1,則下一入場單的交易手數使用0.1作為交易量
   return(lot);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()//檢查入場條件的情況並作處理
  {
   double ma;
   int    res;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;//如果當前K線持倉量大於1,說明不是K線的開盤時間點,則直接返回 否則是K線第一個價格,則繼續下面的過程
//---- get Moving Average
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);//獲得當前的均線數值
//---- sell conditions
   if(Open[1]>ma && Close[1]<ma)  //如當前K開盤價大於均線,而前一K收盤價小於均線,則發出入場多單
     {
      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
      return;
     }
//---- buy conditions
   if(Open[1]<ma && Close[1]>ma)  //如當前K開盤價小於均線,而前一K收盤價大於均線,則發出入場空單
     {
      res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
      return;
     }
//----
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()//檢查出場條件的情況並作處理
  {
   double ma;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //---- check order type
      if(OrderType()==OP_BUY)
        {
         if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);//如果持倉是多單,則當當前K開盤價小於均 線,而前一K收盤價大於均線,則發出平倉指令
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White););//如果持倉是空單,則當當前K開盤價大於 均線,而前一K收盤價小於均線,則發出平倉指令
         break;
        }
     }
//----
  }
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()//主循環過程
  {
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//----
  }
//+------------------------------------------------------------------+

GoForTrading 發表在 痞客邦 留言(0) 人氣()

對於程式語言一直抱持排斥的心態,所以無法好好地靜下心學好

交易已經進展到『程式自動交易』非走不可的階段,看看如何能快速又簡單進入

先來學習別人的,多看並利用一些好工具,來簡化學習的曲線

//+------------------------------------------------------------------+
//|
                        Moving Average.mq4 |                                                                      
//|                           http://www.imt4.com |
//+------------------------------------------------------------------+
#define MAGICMA  20050610
extern double Lots               = 0.1;
extern double MaximumRisk        = 0.02;
extern double DecreaseFactor     = 3;
extern double MovingPeriod       = 10;
extern double MovingShift        =3;
//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//---- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
   double lot=Lots;
   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);
//---- calcuulate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
         //----
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;
        }
      if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
//---- return lot size
   if(lot<0.1) lot=0.1;
   return(lot);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double ma;
   int    res;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//---- sell conditions
   if(Open[1]>ma && Close[1]<ma) 
     {
      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
      return;
     }
//---- buy conditions
   if(Open[1]<ma && Close[1]>ma) 
     {
      res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
      return;
     }
//----
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
  {
   double ma;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //---- check order type
      if(OrderType()==OP_BUY)
        {
         if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
         break;
        }
     }
//----
  }
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()
  {
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//----
  }
//+------------------------------------------------------------------+
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
以下是註解
//+------------------------------------------------------------------+
//|                                      Moving Average.mq4 |                    
//|                                       http://www.imt4.com |
//+------------------------------------------------------------------+
#define MAGICMA  20050610 //定義本EA操作的訂單的唯一標識號碼
extern double Lots               = 0.1;//每單的交易量
extern double MaximumRisk        = 0.02;//作者定義的最大風險參數
extern double DecreaseFactor     = 3;//作者定義的參數,作用要看程序中的用法
extern double MovingPeriod       = 10;//EA中使用的均線的周期
extern double MovingShift        =3;//EA中使用的均線向左的K線偏移量
//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)//函數作用,計算當前持倉訂單的數量
  {
   int buys=0,sells=0;//定義兩個臨時變量,準備用於後面的多空訂單的個數計算
//----
   for(int i=0;i<OrdersTotal();i++)//循環檢測當前的訂單隊列
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;//挑出持倉單的每一個訂單位置
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)//根據訂單位置,比較是否是當前K線商品以及訂單唯一標識號是否和本程序設置的一致(用於避免EA誤操作其他程序控制的持倉單)
        {
         if(OrderType()==OP_BUY)  buys++;//找到符合條件的持倉單後,如果是多單,則臨時變量buys增加1
         if(OrderType()==OP_SELL) sells++;//找到符合條件的持倉單後,如果是空單,則臨時變量sells增加1
        }
     }
//---- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);//本函數返回查詢計算結束時的持倉單的個數。
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double LotsOptimized()//函數目的,根據要求 計算出訂單交易量
  {
   double lot=Lots;
   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);//通過風險系數的計算獲得當前入場單應該采用的交易量
//---- calcuulate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }//循環查詢出場單隊列
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;//
         //----
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;//循環計算所有出場虧損單的虧損總和
        }
      if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);//如果虧損額大於1,則下一入場單的交易量修正為新的計算結果。
     }
//---- return lot size
   if(lot<0.1) lot=0.1;//如果計算出的交易量小於帳戶最小手數0.1,則下一入場單的交易手數使用0.1作為交易量
   return(lot);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()//檢查入場條件的情況並作處理
  {
   double ma;
   int    res;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;//如果當前K線持倉量大於1,說明不是K線的開盤時間點,則直接返回 否則是K線第一個價格,則繼續下面的過程
//---- get Moving Average
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);//獲得當前的均線數值
//---- sell conditions
   if(Open[1]>ma && Close[1]<ma)  //如當前K開盤價大於均線,而前一K收盤價小於均線,則發出入場多單
     {
      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
      return;
     }
//---- buy conditions
   if(Open[1]<ma && Close[1]>ma)  //如當前K開盤價小於均線,而前一K收盤價大於均線,則發出入場空單
     {
      res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
      return;
     }
//----
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()//檢查出場條件的情況並作處理
  {
   double ma;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //---- check order type
      if(OrderType()==OP_BUY)
        {
         if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);//如果持倉是多單,則當當前K開盤價小於均 線,而前一K收盤價大於均線,則發出平倉指令
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White););//如果持倉是空單,則當當前K開盤價大於 均線,而前一K收盤價小於均線,則發出平倉指令
         break;
        }
     }
//----
  }
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()//主循環過程
  {
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//----
  }
//+------------------------------------------------------------------+

GoForTrading 發表在 痞客邦 留言(0) 人氣()

Relate Posts


資料來源:myEAtrade

GoForTrading 發表在 痞客邦 留言(0) 人氣()

Close

您尚未登入,將以訪客身份留言。亦可以上方服務帳號登入留言

請輸入暱稱 ( 最多顯示 6 個中文字元 )

請輸入標題 ( 最多顯示 9 個中文字元 )

請輸入內容 ( 最多 140 個中文字元 )

reload

請輸入左方認證碼:

看不懂,換張圖

請輸入驗證碼