求助大神,一条K线开很多单?

 
double stopLoss    = 300; // 止损
double takeProfit  = 200; // 止盈
double maPeriod    = 14;   // 均线周期
int    slippage    = 2;
int    Risk        = 5;    // 风险系数
double fibLevels[] = { 0.236, 0.382, 0.5, 0.618};
//----------------------------------------------------------
void OnTick()
  {
    double   LastOrderTime = 0;
    double   maValue = iMA(NULL, 0, maPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
    double   lot=NormalizeDouble(AccountFreeMargin()*Risk/100/10000,2);
    if (Time[0] == LastOrderTime) return;
        for (int i = 0; i < ArraySize(fibLevels); i++)
         {
          double fibLevelPrice1 = maValue + (High[1] - Low[1]) * fibLevels[i];
           double fibLevelPrice2 = maValue - (High[1] - Low[1]) * fibLevels[i];
             if(Open[0] >= fibLevelPrice1)
                {
                 // 下单
                 OrderSend(Symbol(), OP_BUY, lot, Ask, slippage, (Ask - stopLoss * Point),(Ask + takeProfit * Point), "Fibonacci Trading", 0, 0, Green);
                 LastOrderTime = Time[0];
                 // 跳出循环
               }
              else
               if(Open[0]<= fibLevelPrice2)
                {
                 // 下单
                 OrderSend(Symbol(), OP_SELL, lot, Bid, slippage, (Bid+ stopLoss * Point),(Bid- takeProfit * Point), "Fibonacci Trading", 0, 0, Green);
                 LastOrderTime = Time[0];
            }
       }

  }

加入了时间限制代码也不行,还是开很多单,各位老大,我该怎么改?

 
首先啊,你说的不明白,你是想这个ea只开一个单子,平仓可再开&nbsp; &nbsp; &nbsp;还是一根k线只开一张单子!!处理的方式是不一样的!!!
你的代码看了个大概,,看不下了,,看别人代码头疼,,尤其是英文的,,现在变量名可以弄成中文的了,,很方便,看着也不晕!!!

如果你的意思是一个ea只开一张订单, 平仓可再开。。可以把开单单独写成一个函数,这样比较严谨,不容易出错,,循环一下是否有你设定的魔术数和注译的订单,,没有就开单有了就不开


//开单函数  多

int buy(double buy手数,int buy滑点,double buy止损,double buy止盈,string buy注译 ,int buy魔术数) // 下单手数  滑点 止损 止盈 注译 魔术数

      {

         int a=0;

         //a= OrderSend(Symbol(),OP_BUY,buy手数,Ask,buy滑点,0,0,buy注译,buy魔术数,0,clrRed);

         bool zhaodan=false;

           for(int i=0;i<OrdersTotal();i++)  //循环所有订单,从0号开始

             {

                if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES  )==true) //选中订单

              {

                 string 注释1 =OrderComment();

                 int 魔术数1=OrderMagicNumber();

                 if(OrderSymbol()==Symbol() &&  OrderType()==OP_BUY   && 注释1==buy注译  &&  魔术数1==buy魔术数)

                     {

                        zhaodan=true;

                        break;

                     }

             }

            } 

        if(zhaodan==false)

            { 

              if(buy止损==0  &&  buy止盈!=0)

                  {

                      a= OrderSend(Symbol(),OP_BUY,buy手数,Ask,buy滑点,0,Ask+buy止盈*Point,buy注译,buy魔术数,0,clrRed);//printf("11111");

                  }

               if(buy止损!=0  &&  buy止盈==0)

                  {

                      a= OrderSend(Symbol(),OP_BUY,buy手数,Ask,buy滑点,Ask-buy止损*Point,0,buy注译,buy魔术数,0,clrRed);//printf("22222");

                  }

                if(buy止损==0  &&  buy止盈==0)

                  {

                      a= OrderSend(Symbol(),OP_BUY,buy手数,Ask,buy滑点,0,0,buy注译,buy魔术数,0,clrRed);//printf("33333");

                  }

                if(buy止损!=0  &&  buy止盈!=0)

                  {

                      a= OrderSend(Symbol(),OP_BUY,buy手数,Ask,buy滑点,Ask-buy止损*Point,Ask+buy止盈*Point,buy注译,buy魔术数,0,clrRed);//printf("44444");

                  } 

                if(a<0)

                         {

                          Print("OrderSend 失败错误 # +++++++++++++++++++++++++++++++++++++",GetLastError());

                          //return(0);

                         }


            }   

         return(a);

      }

 //开单函数 空     

int sell(double sell手数,int sell滑点,double sell止损,double sell止盈,string sell注译 ,int sell魔术数)

      {

         int a=0;

        // a= OrderSend(Symbol(),OP_SELL,sell手数,Bid,sell滑点,0,0,sell注译,sell魔术数,0,clrAqua);

         bool zhaodan=false;

           for(int i=0;i<OrdersTotal();i++)  //循环所有订单,从0号开始

             {

                if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES  )==true) //选中订单

              {

                 string 注释1 =OrderComment();

                 int 魔术数1=OrderMagicNumber();

                 if(OrderSymbol()==Symbol()  &&  OrderType()==OP_SELL     && 注释1==sell注译  &&  魔术数1==sell魔术数)

                     {

                        zhaodan=true;

                        break;

                     }

             }

            }

        if(zhaodan==false)

            {

               if(sell止损==0  &&  sell止盈!=0)

                  {

                      a= OrderSend(Symbol(),OP_SELL,sell手数,Bid,sell滑点,0,Bid-sell止盈*Point,sell注译,sell魔术数,0,clrAqua);//printf("55555");

                  }

                  if(sell止损!=0  &&  sell止盈==0)

                  {

                      a= OrderSend(Symbol(),OP_SELL,sell手数,Bid,sell滑点,Bid+sell止损*Point,0,sell注译,sell魔术数,0,clrAqua);//printf("666666");

                  }

                  if(sell止损==0  &&  sell止盈==0)

                  {

                      a= OrderSend(Symbol(),OP_SELL,sell手数,Bid,sell滑点,0,0,sell注译,sell魔术数,0,clrAqua);//printf("777777");

                  }

                  if(sell止损!=0  &&  sell止盈!=0)

                  {

                      a= OrderSend(Symbol(),OP_SELL,sell手数,Bid,sell滑点,Bid+sell止损*Point,Bid-sell止盈*Point,sell注译,sell魔术数,0,clrAqua);//printf("88888");

                  }

                  if(a<0)

                            {

                             Print("OrderSend 失败错误 # ------------------------------------",GetLastError());

                             //return(0);

                            }


            }//空单手数(); */  

         return(a);

      }

//=========================================================================================

把这个放到开单函数替代开单函数就行了

buy(格式化手数精度(比例下单手数),滑点,止损,止赢,注释,魔术数);// 下单手数  滑点 止损 止盈 注译 魔术数

sell(格式化手数精度(比例下单手数()),滑点,止损,止赢,注释,魔术数);// 下单手数  滑点 止损 止盈 注译 魔术数


能看懂吗?看不懂我就没办法了,只能帮到你这了

 

详细看图中标示。当然,代码中还有缺陷。 比如,手数需要规范为标准的手数小数位数,止盈止损价也一样,否则有可能报错,有是可能哈


 
Lin Luo #:

详细看图中标示。当然,代码中还有缺陷。 比如,手数需要规范为标准的手数小数位数,止盈止损价也一样,否则有可能报错,有是可能哈


Lin Luo #:

其实这个EA就是价格在穿4个斐波那契回测位时开单,但每穿越一个回测位只开一单,如果同时穿越4个回测位就开4单,应该是一个很简单的EA,但是因为本人是新手,逻辑性也不强,老是写不准确,能麻烦大神贴一个完整的代码吗?非常感谢!!!

 
double stopLoss    = 300; // 止损
double takeProfit  = 200; // 止盈
double maPeriod    = 14;   // 均线周期
int    slippage    = 2;
int    Risk        = 5;    // 风险系数
double fibLevels[] = { 0.236, 0.382, 0.5, 0.618};

double   sl,tp;
//----------------------------------------------------------
void OnTick()
  {
     static double   LastOrderTime = 0;
    
     if (Time[0]!= LastOrderTime)
     {
        double   maValue = iMA(NULL, 0, maPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
        double   mstep=MarketInfo(_Symbol,MODE_LOTSTEP);
        double   lot=NormalizeDouble(AccountFreeMargin()*Risk/100.0/10000.0,log10(1/mstep));

        for (int i = 0; i < ArraySize(fibLevels); i++)
        {
         double fibLevelPrice1 = maValue + (High[1] - Low[1]) * fibLevels[i];
         double fibLevelPrice2 = maValue - (High[1] - Low[1]) * fibLevels[i];
         if(Open[0] >= fibLevelPrice1)
         {
             sl=NormalizeDouble((Ask - stopLoss * Point),Digits);
             tp=NormalizeDouble((Ask + takeProfit * Point),Digits);
         // 下单
            if(!OrderSend(Symbol(), OP_BUY, lot, Ask, slippage, sl, tp, "Fibonacci Trading", 0, 0, Green))
                Print("BUY开仓失败! err=",GetLastError());
         }
         else{
            if(Open[0]<= fibLevelPrice2)
            {
                sl=NormalizeDouble((Bid+ stopLoss * Point),Digits);
                tp=NormalizeDouble((Bid- takeProfit * Point),Digits);
            // 下单
               if(!OrderSend(Symbol(), OP_SELL, lot, Bid, slippage, sl, tp, "Fibonacci Trading", 0, 0, Green))
                  Print("SELL开仓失败! err=",GetLastError());
            }
         }
        }
        LastOrderTime = Time[0]; 
     }
        
 }

就你原文档简单改了下,更多交易细节考虑,不在此啰嗦……

 
Lin Luo #:

就你原文档简单改了下,更多交易细节考虑,不在此啰嗦……

非常感谢!我测试一下先!
 
void OnTick()
  {
    static double   LastOrderTime = 0;
    double   maValue = iMA(NULL, 0, maPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
    double   lot=NormalizeDouble(AccountFreeMargin()*Risk/100/10000,2);
    if (Time[0] == LastOrderTime) return;
        for (int i = 0; i < ArraySize(fibLevels); i++)
         {
          double fibLevelPrice1 = maValue + (High[1] - Low[1]) * fibLevels[i];
           double fibLevelPrice2 = maValue - (High[1] - Low[1]) * fibLevels[i];
             if(Open[0] >= fibLevelPrice1)
                {
                 // 下单
                 OrderSend(Symbol(), OP_BUY, lot, Ask, slippage, (Ask - stopLoss * Point),(Ask + takeProfit * Point), "Fibonacci Trading", 0, 0, Green);
                 LastOrderTime = Time[0];
                 // 跳出循环
               }
              else
               if(Open[0]<= fibLevelPrice2)
                {
                 // 下单
                 OrderSend(Symbol(), OP_SELL, lot, Bid, slippage, (Bid+ stopLoss * Point),(Bid- takeProfit * Point), "Fibonacci Trading", 0, 0, Green);
                 LastOrderTime = Time[0];
            }
       }

  }

 
Gang Ye #:
void OnTick()
  {
    static double   LastOrderTime = 0;
    double   maValue = iMA(NULL, 0, maPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
    double   lot=NormalizeDouble(AccountFreeMargin()*Risk/100/10000,2);
    if (Time[0] == LastOrderTime) return;
        for (int i = 0; i < ArraySize(fibLevels); i++)
         {
          double fibLevelPrice1 = maValue + (High[1] - Low[1]) * fibLevels[i];
           double fibLevelPrice2 = maValue - (High[1] - Low[1]) * fibLevels[i];
             if(Open[0] >= fibLevelPrice1)
                {
                 // 下单
                 OrderSend(Symbol(), OP_BUY, lot, Ask, slippage, (Ask - stopLoss * Point),(Ask + takeProfit * Point), "Fibonacci Trading", 0, 0, Green);
                 LastOrderTime = Time[0];
                 // 跳出循环
               }
              else
               if(Open[0]<= fibLevelPrice2)
                {
                 // 下单
                 OrderSend(Symbol(), OP_SELL, lot, Bid, slippage, (Bid+ stopLoss * Point),(Bid- takeProfit * Point), "Fibonacci Trading", 0, 0, Green);
                 LastOrderTime = Time[0];
            }
       }

  }

哈哈。大神提示这个正确。我也没注意到……晃眼看到个d就以为是datetime了呢。。。。。。