Scriverò un EA gratuitamente - pagina 18

 

Bisogno di aiuto.

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

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

Si prega di avvisare: gli ordini non vengono aperti ogni giorno il trawling non funziona e gli ordini aperti vengono chiusi non secondo il TP. Cosa sto facendo di sbagliato?


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:

Si prega di avvisare: gli ordini non vengono aperti ogni giorno il trawling non funziona e gli ordini aperti vengono chiusi non secondo il TP. Cosa sto facendo di sbagliato?


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()
{
 ......
 

se (IsFirstTick == true)

IsFirstTick = false;

Sostituirei questo pezzo con

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

Dove la variabile TM è dichiarata come DateTime fuori dalla funzione OnTick(), cioè è globale per questo modulo.

Non capisco questo codice: if(Open[0] < Open[StartHour])

Lo StartHour è uguale a 23 e suggerisce che il prezzo aperto della barra zero sarà confrontato con il prezzo aperto della 23a barra precedente. Beh, ok, forse è un trucco dell'Expert Advisor.

Ma questo design non è affatto appropriato.

      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);
         }   
      }

Cosa succede se la variabile ticket è uguale a zero, o se l'EA è stato reinizializzato e questa variabile è stata resettata per default?

 
StartHour è l'ora in cui l'EA deve essere eseguito. Dovrebbe essere l'una di notte. Perché la pesca a strascico non funziona?
 
MIR_KAZAN:
Lo StartHour è l'ora in cui l'EA dovrebbe lavorare. Dovrebbe essere l'una di notte. Perché la pesca a strascico non funziona?

Bisogna analizzare il codice per capire perché non funziona.

Provate a inserire lafunzione Print("Tralling_Stop") nella funzioneTralling_Stop(), e vedete se questo messaggio (Tralling_Stop) appare nel log, se no, allora questa funzione non viene chiamata. Se ce l'avete, analizzate la funzione Tralling_Stop() stessa, forse contiene qualche errore logico.

In generale, ovunque ci siano condizioni logiche if, inserire Print(" condizione 1" ), Print(" condizione 2" ), ecc. Esegui l'Expert Advisor nello strategy tester e nel diario puoi tracciare la logica del tuo EA.

 
vitales:

Bisogna analizzare il codice per capire perché non funziona.

Provate a inserire lafunzione Print("Tralling_Stop") nella funzioneTralling_Stop(), e vedete se questo messaggio (Tralling_Stop) appare nel log, se no, allora questa funzione non viene chiamata. Se sì, analizzate la funzione Tralling_Stop() stessa - forse ci sono alcuni errori logici in essa.

In generale, ovunque ci siano condizioni logiche if, inserire Print(" condizione 1" ), Print(" condizione 2" ), ecc. Esegui l'Expert Advisor nello Strategy Tester e nel log puoi tracciare la logica del tuo EA.


Ho provato a riscriverlo, ma ancora non funziona come ho bisogno. Gli ordini non vengono aperti quando voglio io, quindi non sono trillati. Secondo l'idea, l'Expert Advisor dovrebbe funzionare in questo modo: alla chiusura dell'ultima candela in un giorno (alle 00:00) dovrebbe aprire due ordini pendenti: High (per comprare) e Low (per vendere) e poi semplicemente trillarli.

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:

Prova

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

Sostituire con:

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

Sostituire con:

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();

Inoltre, i prezzi devono essere normalizzati usando NormalizeDouble(). Cioè, invece diLow[1]-StopLoss*Point dovete scrivere NormalizeDouble(Low[1]-StopLoss*Point,Digits()).

Inoltre, secondo il tuo codice, se la variabile _StepUse è uguale a false, il tuo trailing stop non funzionerà. Guardate attentamente il codice della funzione Trailing()

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

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

Prova

Sostituire con:

Sostituire con:

Inoltre, i prezzi devono essere normalizzati usando NormalizeDouble(). Cioè, invece diLow[1]-StopLoss*Point dovete scrivere NormalizeDouble(Low[1]-StopLoss*Point,Digits()).

Inoltre, secondo il tuo codice, se la variabile _StepUse è uguale a false, il tuo trailing stop non funzionerà. Guardate attentamente il codice della funzione Trailing().

Siete in contatto? Inviami un messaggio a http://vk.com/computerwizard116. Non so più come risolvere il problema EA. Sul mio conto demo ho lavorato su questa strategia per una settimana

E funziona. E nei test, questo mascalzone non chiude nemmeno l'ordine al punto di takeout(((((( Nella foto, si può vedere che il prezzo è andato oltre il punto di takeout ed è tornato indietro, ma ha chiuso in perdita, dannazione !((((

Perché lo fa?

File:
 
MIR_KAZAN:

Siete in contatto? Mandatemi un'e-mail a http://vk.com/computerwizard116. Non so più come risolvere il problema EA. Ho usato questa strategia per una settimana su un conto demo

e funziona. Ma quando si prova, questo mascalzone non chiude nemmeno l'ordine a takeaway. (((((( Nella foto, si può vedere il prezzo è andato oltre il takeaway ed è tornato indietro, ma ha chiuso in perdita.

Perché lo fa?

Non sono in contatto.

Gliordini Take profit e Stop loss non dipendono dal consulente, vengono eseguiti sul server del broker. L'EA imposta solo il take profit e lo stop loss, non li esegue. Controlla se il take profit è già stato impostato dopo che il prezzo ha raggiunto questo valore. In altre parole, l'ordine è stato aperto prima, e poi il prezzo si muoveva avanti e indietro, e poi è stato impostato il take profit.

 
vitales:

Non sono in contatto.

L'esecuzione degli ordini di take profit e stop loss non dipende dall'EA, vengono eseguiti sul server del broker. L'EA imposta solo gli ordini take e stop, non li esegue. Controlla se il take profit è già stato impostato dopo che il prezzo ha raggiunto questo valore. In altre parole, prima è stato aperto l'ordine, poi il prezzo è andato avanti e indietro, e poi è stato impostato il take profit.

Come faccio a incollare TP, Sl in OrderSend, in modo che SL fosse High della candela precedente e TP fosse Low della precedente + TakeProfit?