Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1653

 

Per un tester questo

OrderSend

andrà bene e funzionerà anche su server veloci, ma se non sei un tester è meglio farlo secondo la documentazione :)

 
Ragazzi, ho bisogno di aiuto, è da qualche giorno che non riesco a fare le modifiche necessarie al seguente codice:
void start()
{
   StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL); 
   
   // Определение направления пересечения мувингов
   if (Init) InitMetod(); 
   
   // Трейлинг стоп открытых позиций
   if (Trailing != 0 ) RealTrailOrder(TrailStop, TrailStep, StopLevel, MagicNumber);
   
   // Ожидание нового бара на графике
   if(timeprev == Time[0]) return;
   timeprev = Time[0];
   
   // Открытие ордера по методу Пуриа
   CheckForOpen();
}
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen() // Открытие ордера по методу Пуриа
{
   double malw,mas1,mas2,macd;
   int    res;  
   // Считывание параметров индикаторов
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,0);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,0);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,0);
   macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,0);
  
   // Проверяем положение мувмнгов
   if(malw>mas1 && malw>mas2  && OrderSell)
     {
     OrderBuy=true;
     OrderSell=false;
     Order=true;
     }
   
   if(malw<mas1 && malw<mas2  && OrderBuy)
     {
     OrderBuy=false;
     OrderSell=true;
     Order=true;
     }

   // Открываем ордер Buy
   if(macd>0 && OrderBuy && Order)
     {
     res=OrderSend(Symbol(),OP_BUY,Lots(),Ask,Slip,Bid-StopLoss*Point,Ask+TakeProfit*Point,"",MagicNumber,0,Blue);
     Order=false;
     return;
     }     
   // Открываем ордер Sell   
   if(macd<0 && OrderSell && Order)
     {
     res=OrderSend(Symbol(),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss*Point,Bid-TakeProfit*Point,"",MagicNumber,0,Red);
     Order=false;
     return;
     }
 
}  
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double Lots()  // Расчет объема лота
{
   double Lots;
   if (Lot > 0) return(Lot);
   Lots=AccountFreeMargin()/5000;
   Lots=MathMin(15,MathMax(0.01,Lots));
   if(Lots<0.1) Lots=NormalizeDouble(Lots,2);
   else 
     {
     if(Lots<1) Lots=NormalizeDouble(Lots,1);
     else       Lots=NormalizeDouble(Lots,0);
     }
   return(Lots);
}
//+------------------------------------------------------------------+
//| Init metod Puria function                                        |
//+------------------------------------------------------------------+
void InitMetod()  // Опредеоение начального пересечения мувингов
{
   double malw,mas1,mas2;
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,0);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,0);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,0);

   if((malw<=mas1 && malw>=mas2) || (malw>=mas1 && malw<=mas2))
     {
     Init=false;
     OrderBuy=true;
     OrderSell=true;
     }   
   return;
}

In realtà, quello che ho provato ma che non ho potuto aggiungere qui: fare in modo che l 'EA aspetti 4 prezzi di apertura delle candele di fila dopo che tutti gli indicatori ( prezzi di apertura delle candele) coincidono:


  1. 1. Il prezzo di apertura della prima candela - (5) sopra (75) e (85) + barra MACD aperta sopra 0 - 1 su 4 conferme è;
    2. Il prezzo di apertura della seconda candela - (5) sopra (75) e (85) + barra MACD aperta sopra 0- 2 su 4 conferme è;
    3.Il prezzo di apertura della 3a candela - (5) sopra (75) e (85) + barra MACD aperta sopra 0- 3 su 4 conferme sì;
    4. Il prezzo di apertura della 4a candela - (5) sopra (75) e (85) + barra MACD aperta sopra 0- 4 su 4 conferme- Aprire trade per comprare sulla stessa candela (4).

La stessa situazione con gli ordini di vendita, solo nell'altra direzione gli indicatori dovrebbero aprirsi. E c'è un punto importante - se, per esempio, in qualsiasi fase della 1a candela alla 4a, gli indicatori cambiano la loro posizione(per esempio, sulla 3a candela di apertura, la barra MACD si apre o sotto 0, o = 0) - allora tutto si resetta, perché i segnali non sono stati controllati sull'apertura della 4a candela di fila.

Per favore consigliate, programmatori esperti, cosa deve essere cambiato nel codice per far funzionare queste condizioni? Ho provato un sacco di cose, e non so...

 
   if(malw>mas1 && malw>mas2  && OrderSell)

Come si dice, non prendeteci in parola.

OrderSell

non so cosa potrebbe esserci dentro, condividere la logica decisionale nel codice.

 

artem artem #:

Il prezzo di apertura della prima candela - (5) sopra (75) e (85) + barra MACD aperta sopra 0 - 1 su 4 conferme sì;

2 Il prezzo di apertura della 2a candela - (5) sopra (75) e (85) + barra MACD aperta sopra 0- 2 su 4 conferme sì;

3 Il prezzo di apertura della terza candela - (5) sopra (75) e (85) + barra MACD aperta sopra 0- 3 su 4 conferme è;

4 Il prezzo di apertura della 4a candela - (5) sopra (75) e (85) + barra MACD aperta sopra 0- 4 delle 4 conferme- Aprire il trade per comprare sulla stessa candela (4a).

    //+------------------------------------------------------------------+
    //| Expert tick function                                             |
    //+------------------------------------------------------------------+
    void OnTick()
      {
    //---
       if(CheckForOpen()==0)
         {
          if(OrderSend(Symbol(),OP_BUY,Lots(),Ask,Slip,Bid-StopLoss*Point,Ask+TakeProfit*Point,"",MagicNumber,0,Blue)) Print("BUY OK");
         }
       if(CheckForOpen()==1)
         {
          if(OrderSend(Symbol(),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss*Point,Bid-TakeProfit*Point,"",MagicNumber,0,Red)) Print("SELL OK");
         }
      }
    //+------------------------------------------------------------------+
    //| Check for open order conditions                                  |
    //+------------------------------------------------------------------+
    int CheckForOpen() // Открытие ордера по методу Пуриа
      {
       double malw,mas1,mas2,macd;
       int    res=-1, buy=0, sell=0;
       // Считывание параметров индикаторов 3 свечи
       malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,3);
       mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,3);
       mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,3);
       macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,3);
       if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
       if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
       // Считывание параметров индикаторов 2 свечи
       malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,2);
       mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,2);
       mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,2);
       macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,2);
       if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
       if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
       // Считывание параметров индикаторов 1 свечи
       malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,1);
       mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,1);
       mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,1);
       macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,1);
       if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
       if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
       // Считывание параметров индикаторов 0 свечи
       malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,0);
       mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,0);
       mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,0);
       macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,0);
       if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
       if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
       
       if(buy ==4) res=0;
       if(sell==4) res=1;
       return(res);
      }
     
    malw

    Segnare un valore con un altro, niente? Dividere il primo blocco = soluzione, il secondo blocco = soluzione, confrontare i blocchi.

     
    Volodymyr Zubov #:

    Segnare un valore con un altro, niente? Dividere il primo blocco = soluzione, il secondo blocco = soluzione, confrontare i blocchi.

    È scritto a chi o a cosa?
     
    Si scopre che hai
    malw
    nel codice e lì viene fuori un errore logico.
     
    Volodymyr Zubov #:
    Si scopre che avete, nel codice, un errore logico.
    Controlla prima di scrivere
     

    OK, ma le variabili si bloccheranno se le usi in questo modo e poi non saprai quali sono i "miracoli"

     
    Volodymyr Zubov #:

    Ok, ma le variabili andranno in crash se le usi in questo modo e poi non saprai quali sono i "miracoli".

    Se conosci un'altra opzione, scrivila...

    Puoi aiutare le persone).