[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 842

 
Avete la modifica dell'ordine nello stesso blocco dell'apertura, e la sua condizione è nessun ordine. Si scopre che hai appena aperto un ordine e subito cerchi di modificarlo - ma da dove verrà il profitto di 5 pips?
 

Ciao a tutti, recentemente mi sono interessato alle medie mobili. Ho trovato alcune combinazioni di medie mobili e condizioni di trading e ho deciso di controllare il mio TS, se è redditizio o meno, e ottimizzarlo, semmai. Ma il mio Expert Advisor non ha aperto accordi durante i test. Ho passato tutta la sera a cercare di capire la soluzione e ho deciso di chiedere a voi, cari programmatori. Per capire come funziona l'EA, spiegherò brevemente il mio TS: sul grafico con EMA(13) e EMA(55), se una barra ha attraversato EMA(13) e tutte le barre seguenti erano sopra/sotto EMA(13), allora toccando il prezzo con MA(13) si apre una posizione nella direzione delle barre precedenti (dopo l'attraversamento + almeno 9 e non più di 23). Take Profit 60 punti, Stop Loss = EMA(55) più meno cinque punti. Questa è in realtà l'intera strategia. Per una migliore illustrazione, ho postato un esempio:

Ed ecco il codice dell'Expert Advisor:

//+------------------------------------------------------------------+
//|                                                          DWM.mq4 |
//|                                 Copyright © 2010, Bobkov Vasiliy |
//|                                          http://www.forex4you.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Bobkov Vasiliy"
#property link      "http://mql4.com"
extern double Lot=0.1;
extern int FastMA=13;         //Быстрая МА
extern int SlowMA=54;         //МедленнаяМА
extern int TP=60;             //Тейк профит
extern int MinBars=8;         //Минимальное кол-во баров вне МА
extern int MaxBars=25;        //Максимальное кол-во баров вне МА
extern int slippage=3;        //Слипадж
extern int Magic=347586;      //Магическое число
extern int Space=10;          //Отступ от МА при тралле ордеров

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
if (OrderCheck()==true)                                        //Проверяем, есть ли ордер...
   {                                                           //...если ордер есть...
   Trall();                                                    //Траллим
   return (0);
   }
else                                                           //...если нет открытых позиций то...
   {
   double FMA=MA(0);
   double SMA=iMA(NULL,0,SlowMA,0,MODE_EMA,PRICE_CLOSE,0);
   for (int x=1;;x++)                                          //Вычесляем сколько баров вне МА...
      {
      if (MA(x)<High[x]&& MA(x)>Low[x]) break;
      }
   if (Bid==FMA && x>MinBars && x<MaxBars)                     //Если условия выполняются, то...
      {
      if (FMA>SMA ) OrdOpen(0,SMA);                            //...открывем сделку на покупку
      if (FMA<SMA) OrdOpen(1,SMA);                             //...или на продажу
      }
   }   
//----
   return(0);
  }
//+------------------------------------------------------------------+

bool OrderCheck()                                              //Функция проверки позиций
   {
   for(int i=1;i<=OrdersTotal();i++)
      {
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) return(true);
         }
      else
         Print("OrderSelect() вернул ошибку - ",GetLastError());
          
      }
    return(false);
   }

void OrdOpen(int type,double SO)                               //Функция открытия позиций
   {
   if (type==0) 
      {
      if (OrderSend(Symbol(),0,Lot,Ask,slippage,SO-Space*Point,Ask+TP*Point,NULL,Magic,0,Blue)==true) return;
      else Print("OrderSend() вернул ошибку - ",GetLastError());
      }
   else 
      {
      if (OrderSend(Symbol(),0,Lot,Bid,slippage,SO+Space*Point,Bid-TP*Point,NULL,Magic,0,Blue)==true) return;
      else Print("OrderSend() вернул ошибку - ",GetLastError());
      }
   return;
   }
   
void Trall()                                                    //Трейллинг стоп
   {
   if (OrderSelect(Magic,SELECT_BY_TICKET)==true)
      {
      double SL=iMA(NULL,0,SlowMA,0,MODE_EMA,PRICE_CLOSE,0);
      if (Bid<iMA(NULL,0,SlowMA,0,MODE_EMA,PRICE_CLOSE,0)) SL=SL+Space*Point;
      else SL=SL-Space*Point;
      if (OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(SL,Digits),OrderTakeProfit(),0,Blue)==true) return;
      else Print("OrderModify() вернул ошибку - ",GetLastError());
      }
   return;
   }
double MA(int m)                                                  //Функция возвращающая значение МА
   {
   return(iMA(NULL,0,FastMA,m,MODE_EMA,PRICE_CLOSE,0));
   }

Se qualcuno può aiutare per favore. Vi darò anche l'EA stesso

File:
dwm.mq4  5 kb
 

Molte funzioni possono essere raccolte in un ciclo for per aprire, cambiare, chiudere posizioni, ecc.

Ecco un semplice esempio:

            bool Ans=OrderModify(Ticket,Price,SL,TP,0);
            if (Ans==true) {
               Alert ("Ордер ",Text,Ticket," модифицирован:)");
               break;                           // Из цикла модифи.
            }

- Domanda: è corretto usare "break" piuttosto che "return" qui? C'è una differenza?

 
chief2000:

Molte funzioni possono essere raccolte in un ciclo for per aprire, cambiare, chiudere posizioni, ecc.

Ecco un semplice esempio:

- Domanda: è corretto usare "break" piuttosto che "return" qui? C'è una differenza?

Da https://docs.mql4.com/ru/basis/operators/break:
"L'istruzione break ferma l'esecuzione dello switch esterno annidato più vicino, while o for. Il controllo è dato all'operatore che segue quello che finisce".

Da https://docs.mql4.com/ru/basis/operators/return:
"L'istruzione return termina la funzione corrente e restituisce il controllo al programma chiamante".

Risposta: è corretto usare "break" qui.

 
abolk:

Da https://docs.mql4.com/ru/basis/operators/break:
"L'operatore di interruzione termina l'esecuzione dell'operatore esterno annidato più vicino, while o for. Il controllo è dato all'operatore che segue quello che finisce".

Da https://docs.mql4.com/ru/basis/operators/return:
"L'operatore di ritorno termina la funzione corrente e restituisce il controllo al programma chiamante".

Risposta: è corretto usare "break" qui.

In realtà uso anch'io break, ma pensavo che return significasse un cambio di tick (e break no).

In realtà, finché l'ordine non cambia, ci sarà un cambio di tick, quindi affinché il tester simuli correttamente la situazione

è necessario usare il ritorno. Giusto?

Forse mi sbaglio ma vorrei capirlo.

 
chief2000:

In realtà uso anch'io break, ma pensavo che return significasse un cambio di tick (mentre break no).

In realtà, finché l'ordine non cambia, il cambio di tick si verifica e quindi il tester deve usare il ritorno per simulare correttamente la situazione

è necessario usare il ritorno. Giusto?

Forse mi sbaglio, ma voglio capire.

Leggiamo nella documentazione: "L'operatore di ritorno interrompe l'esecuzione della funzione corrente e restituisce il controllo al programma chiamante".

Se la funzione start() corrente, leggete di nuovo la documentazione:

https://docs.mql4.com/ru/runtime/start
"Quando arriva una nuova quotazione, viene eseguita la funzione start() degli Expert Advisors e degli indicatori personalizzati collegati. Se all'arrivo di una nuova quotazione viene eseguita la funzione start(), in esecuzione sulla quotazione precedente, allora la quotazione in arrivo sarà ignorata dall'Expert Advisor. Tutte le nuove citazioni, che arrivano durante l'esecuzione del programma, sono ignorate fino alla prossima esecuzione della funzione start(). Dopo di che la funzione start() sarà lanciata solo dopo l'arrivo della prossima nuova quotazione.

 
abolk:

Leggere nella documentazione: "L'istruzione return termina la funzione corrente e restituisce il controllo al programma chiamante".

Se la funzione corrente è start(), leggete di nuovo la documentazione:

https://docs.mql4.com/ru/runtime/start
"Quando arrivano nuove quotazioni, la funzione start() viene eseguita per gli Expert Advisors e gli indicatori personalizzati collegati. Se all'arrivo di una nuova quotazione viene eseguita la funzione start(), in esecuzione sulla quotazione precedente, allora la quotazione in arrivo sarà ignorata dall'Expert Advisor. Tutte le nuove citazioni, che arrivano durante l'esecuzione del programma, sono ignorate fino alla prossima esecuzione della funzione start(). Dopo di che la funzione start() sarà lanciata solo dopo l'arrivo della prossima nuova quotazione.

Vorrei che lo mettessi in parole tue. Non capisco cosa intendi.

Nel tester, se for è terminato con break e qualche altra funzione lo segue, sarà eseguito nello stesso tick. Ma in realtà, diversi tick possono cambiare durante questo tempo (mentre l'ordine viene modificato). Ecco perché penso che il ritorno sia più realistico. Non è vero?

 
chief2000:

Avrei voluto che lo mettessi in parole tue. Non capisco cosa intendi.

Se for è terminato con break e seguito da qualche altra funzione, sarà eseguito nello stesso tick. Ma in realtà, diversi tick possono cambiare durante questo tempo (mentre l'ordine viene modificato). Ecco perché penso che il ritorno sia più realistico. Non è vero?


start() inizia all'inizio di un tick e potrebbe non essere finito all'inizio del tick successivo.

break termina per, e return termina la funzione. Se non ci sono operatori dopo for, non c'è differenza nell'usare for e return per questo algoritmo.

Ma ogni operatore ha il suo scopo. E l'uso involontario di un operatore è come un fucile da caccia scarico.

Di nuovo, nell'algoritmo del ciclo for, per qualche motivo non c'è bisogno di continuare l'esecuzione della funzione, possiamo usare return.

In altre parole, se l'algoritmo richiede una pausa nel ciclo, allora viene usata la pausa, anche se la funzione è ancora terminata dopo il ciclo.

 
abolk:


start() inizia a lavorare all'inizio di un tick e il suo lavoro potrebbe non finire all'inizio del tick successivo.

break completa per, return completa la funzione. Se non ci sono operatori dopo for, non c'è differenza tra usare for e return per questo algoritmo.

Ma ogni operatore ha il suo scopo. E l'uso involontario di un operatore è come un fucile da caccia scarico.

Di nuovo, nell'algoritmo del ciclo for, per qualche motivo non c'è bisogno di continuare l'esecuzione della funzione, possiamo usare return.

In altre parole, se l'algoritmo ci richiede di interrompere il ciclo, mettiamo break, anche se la funzione termina comunque dopo il ciclo.

Mi è venuto in mente un pensiero, dato che tutto questo è stato pensato solo per il tester, possiamo (se necessario) fare quanto segue:

if(IsTesting()==true   ||   IsOptimization()==true) {
   return;
}

break;

Grazie!

 
chief2000:

È venuta un'idea - dato che questo è stato iniziato solo per un tester, si potrebbe (se del caso) fare quanto segue:

Grazie!


è possibile
Motivazione: