我将免费撰写一份顾问报告 - 页 18

 

需要帮助。

http://forum.mql4.com/ru/67309#1011467

Помогите добавить к текущему советник пирамидинг. - MQL4 форум
  • www.mql5.com
Помогите добавить к текущему советник пирамидинг. - MQL4 форум
 

请告知:订单不是每天都打开的,拖网不起作用,打开的订单不是根据TP来关闭的。我做错了什么?


input int    StartHour    = 23;    // Время ачало торговли
input int    TakeProfit   = 40;    // TakeProfit
input int    StopLoss     = 40;    // StopLoss
input int    Lots         = 0.1;   // Лот для торговли
input int    Magic        = 22;    // Магическое число
input int    Trals        = 20;    // Дистанция тралинга в пунктах
input int    _Step        = 1;     // Шаг
input bool   _StepUse     = true;  // Использовать шаг или нет

void OnTick()
{
   static bool IsFirstTick = false;
   static int ticket = 0;
  
   double lot=Lot_Normalize(Symbol(),Lots,1);
   double sl= Dist_Normalize(Symbol(),Trals);
   double step= Dist_Normalize(Symbol(),_Step);
  
   int h= TimeHour(TimeCurrent());
   if(h == StartHour)
   {
    Alert("TimeHor: ", h);
    if (IsFirstTick == true)
      IsFirstTick = false;
     
      bool res;
      res= OrderSelect(ticket, SELECT_BY_TICKET);
      if(res == true)
      {
         if(OrderCloseTime() == 0)
         {
            bool res2;
            res2 = OrderClose(ticket, Lots, OrderClosePrice(), 10);
           
            if(res2 == false)
            {
               Alert("Error Closing Order #", ticket);
               } Alert("Closing Order #", ticket);
         }  
      }
       if(Open[0] < Open[StartHour])
      {
         ticket = OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot");
         Tralling_Stop(OrderSymbol(),Magic,sl,step,_StepUse);
         if(ticket < 0)
         {
           Alert("Error Sending Order!");
         } Alert("Sending Order! BUY_LIMIT");
       }
       else
       {
         ticket = OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot");
         Tralling_Stop(OrderSymbol(),Magic,sl,step,_StepUse);
         if(ticket < 0)
         {
           Alert("Error Sending Order!");
         } Alert("Sending Order! SEL_LLIMIT");
    }  
}
 
}  

double Dist_Normalize(string Smv, int _Distancia)
{
 int Dig= int(MarketInfo(Smv,MODE_DIGITS));
 double Pip=MarketInfo(Smv,MODE_POINT);
 if(Dig==3 || Dig==5)
   return NormalizeDouble(_Distancia*10*Pip,Dig);
 else return NormalizeDouble(_Distancia*Pip,Dig);
 } 


double Lot_Normalize(string Smv, double _lot, double _mult)
{
 double minlot=MarketInfo(Smv,MODE_MINLOT);
 double maxlot=MarketInfo(Smv,MODE_MAXLOT);
 double steplot=MarketInfo(Smv,MODE_LOTSTEP);
 double lot= _lot*_mult;
 if(lot<=minlot) lot+minlot;
 else if(lot>=maxlot) lot=minlot;
 else if(lot>minlot && lot<maxlot)
  {
    int k=int((lot-minlot)/steplot);
    lot=NormalizeDouble(minlot+k*steplot,2);
  }
  return(lot);




void Tralling_Stop(string Smv, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
  int Dig=int(MarketInfo(_Symbol,MODE_DIGITS));
  for(int pos=OrdersTotal()-1; pos>=0;pos--)
    {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Smv &&
      OrderMagicNumber()==_Magic && OrderType()<2)
        {
          double SLPrice;
          if(OrderType()==OP_BUY)
            {
              if(_Step_Use)
              {
                RefreshRates();
                if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig))
                {
                  SLPrice=NormalizeDouble(Ask-_Tral,Dig);
                  if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
                   Alert("Error modifi Order!: ",GetLastError());
                  }
                 }
               else
                 {
                  RefreshRates();
                  if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig))
                    {
                     SLPrice=NormalizeDouble(Bid+_Tral,Dig);
                     if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
                     Alert("Error modifi Order!: ",GetLastError());
                 }
             }
          }
       }
    }
 }            

 
MIR_KAZAN:

请告知:订单不是每天都打开的,拖网不起作用,打开的订单不是根据TP来关闭的。我做错了什么?


input int    StartHour    = 23;    // Время ачало торговли
input int    TakeProfit   = 40;    // TakeProfit
input int    StopLoss     = 40;    // StopLoss
input int    Lots         = 0.1;   // Лот для торговли
input int    Magic        = 22;    // Магическое число
input int    Trals        = 20;    // Дистанция тралинга в пунктах
input int    _Step        = 1;     // Шаг
input bool   _StepUse     = true;  // Использовать шаг или нет

void OnTick()
{
 ......
 

如果(IsFirstTick == true)

IsFirstTick = false

我想用以下方式取代这块

if (TM!=Time[0])
{
   TM = Time[0];
......
}

其中TM变量在OnTick()函数 之外被声明为DateTime,也就是说,它对这个模块是全局的。

我不明白这段代码: if(Open[0] < Open[StartHour])

StartHour等于23,它表明零条的开盘价将与它之前的第23条的开盘价进行比较。嗯,好吧,也许这是专家顾问的一个小把戏。

但这种设计根本就不合适。

      res= OrderSelect(ticket, SELECT_BY_TICKET);
      if(res == true)
      { 
         if(OrderCloseTime() == 0)
         {
            bool res2;
            res2 = OrderClose(ticket, Lots, OrderClosePrice(), 10);
            
            if(res2 == false)
            {
               Alert("Error Closing Order #", ticket);
               } Alert("Closing Order #", ticket);
         }   
      }

如果门票变量等于零,或者EA已经被重新初始化,这个变量已经被默认重置,怎么办?

 
StartHour是EA应该运行的时间。应该是凌晨一点钟。为什么拖网不起作用?
 
MIR_KAZAN:
StartHour是EA应该工作的时间。应该是凌晨1点。为什么拖网不起作用?

你需要分析代码以了解它为什么不工作。

尝试在Tralling_Stop() 函数中插入Print("Tralling_Stop")函数,看看日志中是否出现这个消息(Tralling_Stop),如果没有,那么这个函数没有被调用。如果你有,分析一下Tralling_Stop()函数本身,也许它包含一些逻辑错误。

一般来说,在有逻辑条件的地方,插入Print("条件1")、Print("条件2"),等等。在策略测试器中运行专家顾问,在日志中你可以追踪你的EA的逻辑。

 
vitales:

你需要分析代码以了解它为什么不工作。

尝试在Tralling_Stop() 函数中插入Print("Tralling_Stop")函数,看看日志中是否出现这个消息(Tralling_Stop),如果没有,那么这个函数没有被调用。如果是,请分析一下Tralling_Stop()函数本身--也许其中有一些逻辑错误。

一般来说,在有逻辑条件的地方,插入Print("条件1")、Print("条件2"),等等。在策略测试器中运行专家顾问,在日志中你可以追踪你的EA的逻辑。


我试着重写了一下,但还是不能按我的要求工作。当我想要的时候,订单没有被打开,那么它们就没有被颤动。根据这个想法,专家顾问应该这样工作:在一天的最后一根蜡烛收盘时(00:00),它应该打开两个挂单:高位(买入)和低位(卖出),然后就把它们甩掉。

input int     StartHour    = 1;     // Начало торговли
input int     TakeProfit   = 40;    // TakeProfit
input int     StopLoss     = 10;    // StopLoss
extern double Lots         = 0.1;   // Лот для торговли
input int     Magic        = 22;    // Магическое число
input int     Trals        = 5;     // Дистанция тралинга в пунктах
input int     _Step        = 1;     // Шаг
input bool    _StepUse     = false; // Использовать шаг или неT

void OnTick()
{
   static bool IsFirstTick = false;
  
   Trailing();
  
   if (StartHour != Hour()) { return;}
   if (OrdersTotal()>0)
   {
    OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
    OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);                    
   }
}           

//+------------------------------------------------------------------+ 
void Trailing()
{
  if (_StepUse)
{
  for (int trall=0; trall<OrdersTotal(); trall++) {
    if (!(OrderSelect(trall, SELECT_BY_POS, MODE_TRADES))) continue;
    if (OrderSymbol() != Symbol()) continue;      
 
    if (OrderType() == OP_BUY ) {
      if (Bid-OrderOpenPrice() > StopLoss*Point || OrderMagicNumber()==Magic) {
        if (OrderStopLoss() < Bid-(StopLoss+_Step-1)*Point || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Bid-StopLoss*Point, OrderTakeProfit(), 0, Blue);
       }
      }
    }
 
    if (OrderType() == OP_SELL) {
     if (OrderOpenPrice()-Ask > StopLoss*Point || OrderMagicNumber()==Magic) {
        if (OrderStopLoss() > Ask+(StopLoss+_Step-1)*Point || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Ask+StopLoss*Point, OrderTakeProfit(), 0, Blue);
        }
     }
    }
  }
 }
}
//+------------------------------------------------------------------+

 
MIR_KAZAN:

尝试

if (StartHour != Hour()) { return;} 

替换为。

if (StartHour != TimeHour(Time[0])) { return;}//Если час текущей свечи не равен StartHour то выход из функции и тогда ниже написанный код выполнятся не будет, в том числе и трейлинг стоп. 
 if (OrdersTotal()>0)
{
....
}

替换为。

if (OrdersTotal()==0) 
{
    bool rezult = false;
    rezult=OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
    if (!rezult) Print("Ошибка открытия ордера BUY LIMIT");
    rezult = OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
    if (!rezult) Print("Ошибка открытия ордера SELL LIMIT"); 
//для работы в реале надо сделать более детальную проверку ошибок 

} else Trailing();

此外,价格必须使用NormalizeDouble() 进行规范化处理。也就是说,你必须写NormalizeDouble(Low[1]-StopLoss* Point,Digits())而不是Low[1]-StopLoss*Point。

另外,根据你的代码,如果_StepUse变量等于false,你的追踪止损就不会发挥作用。仔细看一下Trailing()函数的代码

void Trailing()
{
  if (_StepUse)//если false то код внутри скобок выполнятся не будет.
  {
   ......

  }
}// Скорее всего вы этот код просто бездумно скопировали от куда нибудь, даже не понимая как он работает.
 
vitales:

尝试

替换为。

替换为。

此外,价格必须使用NormalizeDouble() 进行规范化处理。也就是说,你必须写NormalizeDouble(Low[1]-StopLoss*Point,Digits())而不是Low[1]-StopLoss*Point。

另外,根据你的代码,如果_StepUse变量等于false,你的追踪止损就不会发挥作用。仔细看一下Trailing()函数的代码。

你们有联系吗?给我发个信息,http://vk.com/computerwizard116。我不知道如何解决EA的问题了。在我的模拟账户上,我已经在这个策略上工作了一个星期

而且很有效。而在测试中,这个流氓甚至没有把订单关闭到取出点(((((( 在照片中,你可以看到价格超过了取出点,然后回去了,但它以亏损收盘,该死的!((()

他为什么要这样做?

附加的文件:
 
MIR_KAZAN:

你们有联系吗?给我发电子邮件,http://vk.com/computerwizard116。我不知道如何解决EA的问题了。我已经在模拟账户上使用这个策略一周了

而它的作用。但在测试时,这个流氓甚至不把订单关闭到外卖。(((((( 在照片中,你可以看到价格超过了外卖,又回去了,但它以亏损收盘。

它为什么要这样做呢?

我没有接触过。

获利和止损订单的执行 不取决于顾问,它们是在经纪人的服务器上执行。该EA只设置止盈和止损,不执行它们。检查在价格达到该值后是否已经设置了止盈。换句话说,订单先被打开,然后价格来回波动,然后设置止盈。

 
vitales:

我没有接触过。

获利和止损订单的执行 并不取决于EA,它们是在经纪人的服务器上执行。该EA只设置采取和停止指令,不执行它们。检查在价格达到该值后是否已经设置了止盈。换句话说,订单先被打开,然后价格来回波动,然后设置止盈。

我如何在OrderSend中粘贴TP和Sl,使SL是前一根蜡烛的高点,TP是前一根蜡烛的低点+TakeProfit?