新手 想建立一個五日高點突破的EA 懇請指點一二

 

//想建立一個五日高點突破的買進訊號

 //        五日低點跌破的賣出訊號
 //請問大大要如何寫呢?
 //懇請指點一二 謝謝
 //ps.以下是改編簡單的均線系統
 //+----------------------------------------------- -------------------+
 //| EA初始化1
 //+----------------------------------------------- -------------------+
 #include <Trade\Trade.mqh> //包含執行的交易庫
 #include <Trade\PositionInfo.mqh> //包含部位的資訊庫

 input int UpPeriod = 5;
 input int DownPeriod = 5;
 
 double iHighest_handle; //存儲句柄
 double iLowest_handle;  //存儲句柄
 
 double Up_buf[];    //存儲每個柱形價格的動態數組
 double Down_buf[];  //存儲每個柱形價格的動態數組
 double Close_buf[]; //存儲每個柱形價格的動態數組

 string my_symbol; //存儲交易品種的變量
 ENUM_TIMEFRAMES my_timeframe; //存儲時間框架的變量

 CTrade m_Trade; //執行交易的結構體
 CPositionInfo m_Position; //獲取持倉信息的結構體
 //+----------------------------------------------- -------------------+
 //| EA初始化2
 //+----------------------------------------------- -------------------+
 int OnInit ()
 {
 my_symbol= Symbol ();          //保存當前圖表的交易品種,使EA對其進一步的操作。
 my_timeframe= PERIOD_CURRENT ; //保存圖表的當前時間框架,使EA對其的進一步操作。
 iHighest_handle=iHighest(my_symbol,my_timeframe,MODE_HIGH,1+UpPeriod,1 ); //應用此指標並獲取指標句柄
 iLowest_handle= iLowest(my_symbol,my_timeframe,MODE_LOW,1+DownPeriod,1 ); //應用此指標並獲取指標句柄
 
 if (iHighest_handle== INVALID_HANDLE || iLowest_handle== INVALID_HANDLE) //檢查指標句柄是否可用
 {
 Print ( "Failed to get the indicator handle" ); //如果句柄沒有獲取到,打印相關報錯信息到日誌文件中
 return (- 1 ); //完成報錯處理 
 } 
  ChartIndicatorAdd ( ChartID (), 0 ,iHighest_handle); //將指標添加到價格圖表中
  ChartIndicatorAdd ( ChartID (), 0 ,iLowest_handle); //將指標添加到價格圖表中
 
 ArraySetAsSeries (Up_buf, true );   //將 iMA_buf 數組的索引設置為時間序列
 ArraySetAsSeries (Down_buf, true );   //將 iMA_buf 數組的索引設置為時間序列
 ArraySetAsSeries (Close_buf, true ); //將Close_buf數組的索引設置為時間序列

 return ( 0 ); //返回0,初始化結束
 }
 
 
 //+----------------------------------------------- -------------------+
 //| EA去初始化函數|
 //+----------------------------------------------- -------------------+
 void OnDeinit ( const int reason)
 {
 IndicatorRelease (iHighest_handle); //刪除指標句柄並釋放分配給它的存儲空間
 IndicatorRelease (iLowest_handle); //刪除指標句柄並釋放分配給它的存儲空間
 ArrayFree (Up_buf);   //釋放動態數組 iMA_buf 的數據
 ArrayFree (Down_buf);   //釋放動態數組 iMA_buf 的數據
 ArrayFree (Close_buf); //釋放動態數組Close_buf的數據
 }
 //+----------------------------------------------- -------------------+
 //| EA的tick函數|
 //+----------------------------------------------- -------------------+
 void OnTick ()
 { 
 int err1= 0 ; //用於存儲指標緩存處理結果的變量
 int err2= 0 ; //用於存儲價格圖表處理結果的變量 
 int err3= 0 ; //用於存儲價格圖表處理結果的變量 
 err1= CopyBuffer (iHighest_handle, my_timeframe , 1 , 2 ,Up_buf);          //將指標數據拷貝到動態數組iMA_buf中,以進一步處理
 err2= CopyBuffer (iLowest_handle, my_timeframe , 1 , 2 ,Down_buf);          //將指標數據拷貝到動態數組iMA_buf中,以進一步處理
 err3= CopyClose (my_symbol,my_timeframe, 1 , 2 ,Close_buf); //將價格數據拷貝到動態數Close_buf中,以於進一步處理
 if (err1< 0 || err2< 0 ) //如果出錯
 {
 Print ( "Failed to copy data from the indicator buffer or price chart buffer" ); //打印相關錯誤信息到日誌文件
 return ; //並退出函數 
 }
 if ( Up_buf[ 0 ]<Close_buf[ 0 ]) //收盤站上均線
 {
 if (m_Position.Select(my_symbol)) //如果該商品已開倉
 {
 if (m_Position.PositionType()== POSITION_TYPE_SELL ) m_Trade.PositionClose(my_symbol); //如果已有空單,就平倉
 if (m_Position.PositionType()== POSITION_TYPE_BUY ) return ; //如已經有多單,就退出
 }
 m_Trade.Buy( 1 ,my_symbol); //到這裡表示沒部位;進多單 
 }  
 if (Down_buf[ 0 ]>Close_buf[ 0 ]) //收盤跌破均線
 {
 if (m_Position.Select(my_symbol))//如果該商品已開倉
 {
 if (m_Position.PositionType()== POSITION_TYPE_BUY ) m_Trade.PositionClose(my_symbol); //如果已有多單,就平倉
 if (m_Position.PositionType()== POSITION_TYPE_SELL ) return ; //如已經有空單,就退出
 }
 m_Trade.Sell( 1 ,my_symbol); //到這裡表示沒部位;進空單 
 }
 }
 //+----------------------------------------------- -------------------+
 
 
另外請問 如何貼上整齊漂亮的程式碼呢?
 
编辑栏有个工具按钮  </> ,就是贴代码的
 
句柄是int 类型 不是double
int  iHighest_handle; //存儲句柄
int  iLowest_handle;  //存儲句柄

//--- 供参考...

//想建立一個五日高點突破的買進訊號

//        五日低點跌破的賣出訊號
//請問大大要如何寫呢?
//懇請指點一二 謝謝
//ps.以下是改編簡單的均線系統
//+----------------------------------------------- -------------------+
//| EA初始化1
//+----------------------------------------------- -------------------+
#include<Trade\Trade.mqh>//包含執行的交易庫
#include<Trade\PositionInfo.mqh>//包含部位的資訊庫

input int UpPeriod=5;
input int DownPeriod=5;

int  iHighest_handle; //存儲句柄
int  iLowest_handle;  //存儲句柄

double Up_buf[];    //存儲每個柱形價格的動態數組
double Down_buf[];  //存儲每個柱形價格的動態數組
double Close_buf[]; //存儲每個柱形價格的動態數組

string my_symbol; //存儲交易品種的變量
ENUM_TIMEFRAMES my_timeframe; //存儲時間框架的變量

CTrade m_Trade; //執行交易的結構體
CPositionInfo m_Position; //獲取持倉信息的結構體
//+----------------------------------------------- -------------------+
//| EA初始化2
//+----------------------------------------------- -------------------+
int OnInit()
  {
   my_symbol= Symbol();          //保存當前圖表的交易品種,使EA對其進一步的操作。
   my_timeframe= PERIOD_CURRENT; //保存圖表的當前時間框架,使EA對其的進一步操作。
   ArraySetAsSeries(Up_buf,true);   //將 iMA_buf 數組的索引設置為時間序列
   ArraySetAsSeries (Down_buf,true );   //將 iMA_buf 數組的索引設置為時間序列
   ArraySetAsSeries (Close_buf, true ); //將Close_buf數組的索引設置為時間序列

   return(0); //返回0,初始化結束
  }
//+----------------------------------------------- -------------------+
//| EA去初始化函數|
//+----------------------------------------------- -------------------+
void OnDeinit(const int reason)
  {
   ArrayFree(Up_buf);   //釋放動態數組 iMA_buf 的數據
   ArrayFree(Down_buf);   //釋放動態數組 iMA_buf 的數據
   ArrayFree (Close_buf); //釋放動態數組Close_buf的數據
  }
//+----------------------------------------------- -------------------+
//| EA的tick函數|
//+----------------------------------------------- -------------------+
void OnTick()
  {
 
   if(CopyClose(my_symbol,my_timeframe,0,2,Close_buf)!=2) //將價格數據拷貝到動態數Close_buf中,以於進一步處理
     {
      Print("Failed to copy data from the indicator buffer or price chart buffer"); //打印相關錯誤信息到日誌文件
      return; //並退出函數 
     }     
     
   int index=iHighest(my_symbol,my_timeframe,MODE_HIGH,5,0);
   double hi5=iHigh(my_symbol,my_timeframe,index);

   index=iLowest(my_symbol,my_timeframe,MODE_LOW,5,0);
   double low5=iLow(my_symbol,my_timeframe,index);

   if(Close_buf[0]>hi5) //收盤站上 5周期高点
     {
      if(m_Position.Select(my_symbol)) //如果該商品已開倉
        {
         if(m_Position.PositionType()==POSITION_TYPE_SELL) m_Trade.PositionClose(my_symbol); //如果已有空單,就平倉
         if(m_Position.PositionType()==POSITION_TYPE_BUY) return; //如已經有多單,就退出
        }
      m_Trade.Buy(1,my_symbol); //到這裡表示沒部位;進多單 
     }

   if(Close_buf[0]<low5) //收盤跌破5周期低点
     {
      if(m_Position.Select(my_symbol))//如果該商品已開倉
        {
         if(m_Position.PositionType()==POSITION_TYPE_BUY) m_Trade.PositionClose(my_symbol); //如果已有多單,就平倉
         if(m_Position.PositionType()==POSITION_TYPE_SELL) return; //如已經有空單,就退出
        }
      m_Trade.Sell(1,my_symbol); //到這裡表示沒部位;進空單 
     }
  }
//+----------------------------------------------- -------------------+
 

謝謝 但好像還是不能用?

我想其中一個原因是

buffer 跟 copy 參數 搞不清楚

該怎麼設定才對呢??



//想建立一個五日高點突破的買進訊號
//        五日低點跌破的賣出訊號
//請問大大要如何寫呢?
//懇請指點一二 謝謝
//ps.以下是改編簡單的均線系統(運作良好)
//但圖表與程式都沒出來
//+----------------------------------------------- -------------------+
//| EA初始化1
//+----------------------------------------------- -------------------+
#include<Trade\Trade.mqh>//包含執行的交易庫
#include<Trade\PositionInfo.mqh>//包含部位的資訊庫

int  iHighest_handle; //存儲句柄
int  iLowest_handle;  //存儲句柄

double Up_buf[];    //存儲每個柱形價格的動態數組
double Down_buf[];  //存儲每個柱形價格的動態數組
double Close_buf[]; //存儲每個柱形價格的動態數組

string my_symbol; //存儲交易品種的變量
ENUM_TIMEFRAMES my_timeframe; //存儲時間框架的變量

CTrade m_Trade; //執行交易的結構體
CPositionInfo m_Position; //獲取持倉信息的結構體
//+----------------------------------------------- -------------------+
//| EA初始化2
//+----------------------------------------------- -------------------+
int OnInit()
  {
   my_symbol= Symbol();          //保存當前圖表的交易品種,使EA對其進一步操作。
   my_timeframe= PERIOD_CURRENT; //保存圖表的當前時間框架,使EA對其進一步操作。   
   
    iHighest_handle= iHighest(my_symbol,my_timeframe,MODE_HIGH,6,1); //應用此指標並獲取指標句柄
    iLowest_handle =  iLowest(my_symbol,my_timeframe,MODE_LOW,6,1);  //應用此指標並獲取指標句柄
 
 if (iHighest_handle== INVALID_HANDLE ||iLowest_handle== INVALID_HANDLE ) //檢查指標句柄是否可用
 {
 Print ( "Failed to get the indicator handle" ); //如果句柄沒有獲取到,打印相關報錯信息到日誌文件中
 return (- 1 ); //完成報錯處理 
 }       
   ChartIndicatorAdd ( ChartID (), 0 ,iHighest_handle); //將指標添加到價格圖表中
   ChartIndicatorAdd ( ChartID (), 0 ,iLowest_handle);  //將指標添加到價格圖表中
   ArraySetAsSeries (Up_buf,true);      //將數組的索引設置為時間序列
   ArraySetAsSeries (Down_buf,true );   //將數組的索引設置為時間序列
   ArraySetAsSeries (Close_buf, true ); //將數組的索引設置為時間序列
   return(0); //返回0,初始化結束
  }
//+----------------------------------------------- -------------------+
//| EA去初始化函數|
//+----------------------------------------------- -------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease (iHighest_handle); //刪除指標句柄並釋放
   IndicatorRelease (iLowest_handle);  //刪除指標句柄並釋放
   ArrayFree(Up_buf);     //釋放動態數組
   ArrayFree(Down_buf);   //釋放動態數組
   ArrayFree (Close_buf); //釋放動態數組
  }
//+----------------------------------------------- -------------------+
//| EA的tick函數|
//+----------------------------------------------- -------------------+
void OnTick()
  {
  
 int err1= 0 ; //用於存儲指標緩存處理結果的變量
 int err2= 0 ; //用於存儲價格圖表處理結果的變量 
 int err3= 0 ; //用於存儲價格圖表處理結果的變量
 err1= CopyBuffer (iHighest_handle, 5 , 1 , 2 ,Up_buf);         //將指標數據拷貝到動態數組,以進一步處理
 err2= CopyBuffer (iLowest_handle, 5 , 1 , 2 ,Down_buf);        //將指標數據拷貝到動態數組,以進一步處理
 err3= CopyClose  (my_symbol,my_timeframe, 1 , 2 ,Close_buf);   //將價格數據拷貝到動態數組,以進一步處理
 if (err1< 0 || err2< 0 || err3< 0 ) //如果出錯
 {
 Print ( "Failed to copy data from the indicator buffer or price chart buffer" ); //打印相關錯誤信息到日誌文件
 return ; //並退出函數 
 }   
   
   if(Close_buf[0]> Up_buf[0]) //收盤站上 區間高點
     {
      if(m_Position.Select(my_symbol)) //如該商品已開倉
        {
         if(m_Position.PositionType()==POSITION_TYPE_SELL) m_Trade.PositionClose(my_symbol); //如有空單,就平倉
         if(m_Position.PositionType()==POSITION_TYPE_BUY) return; //如已經有多單,就退出
        }
      m_Trade.Buy(1,my_symbol); //到這裡表示沒部位;進多單 
     }

   if(Close_buf[0]<Down_buf[0]) //收盤跌破 區間低點
     {
      if(m_Position.Select(my_symbol))//如該商品已開倉
        {
         if(m_Position.PositionType()==POSITION_TYPE_BUY) m_Trade.PositionClose(my_symbol); //如有多單,就平倉
         if(m_Position.PositionType()==POSITION_TYPE_SELL) return; //如已有空單,就退出
        }
      m_Trade.Sell(1,my_symbol); //到這裡表示沒部位;進空單 
     }
  }
//+----------------------------------------------- -------------------+
 
   int index=iHighest(my_symbol,my_timeframe,MODE_HIGH,5,1);
   double hi5=iHigh(my_symbol,my_timeframe,index);

   index=iLowest(my_symbol,my_timeframe,MODE_LOW,5,1);
   double low5=iLow(my_symbol,my_timeframe,index);

0改成1

CopyBuffer(),CopyClose()搞不懂参考文档,有详细的解释。

 

哇!! 可以喔 太感謝Ziheng Zhuang大大了



請問

if(m_Position.PositionType()==POSITION_TYPE_SELL) m_Trade.PositionClose(my_symbol);

這樣是對的嗎?

實際運作會變成多空並存!!??

要怎麼樣才能變成直接平倉呢??

 

請問 hi5 low5 可以畫在主圖上嗎?

 
 SendNotification( 
    my_symbol + "\n" +   "注意!!五日高低區間已穿越 ( " +時間架構T +" )" 

   );


請問 目前圖表如果是H1的時間架構

要怎麼讓時間架構顯示在 通知內呢?

 
陳柏昌:

哇!! 可以喔 太感謝Ziheng Zhuang大大了



請問

if(m_Position.PositionType()==POSITION_TYPE_SELL) m_Trade.PositionClose(my_symbol);

這樣是對的嗎?

實際運作會變成多空並存!!??

要怎麼樣才能變成直接平倉呢??


不会多空并存。

这样写就是直接平仓。

 
陳柏昌:

請問 hi5 low5 可以畫在主圖上嗎?

编写成指标。