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

 
Vitaly Muzichenko:

Finché non ti stanchi di scriverli

seriamente?))
 
multiplicator:
seriamente?))

Sì, ma di regola non se ne scrivono più di tre, perché un codice del genere è difficile da leggere dopo, soprattutto se è passato molto tempo da quando è stato scritto. È meglio dividere questi molti if annidati in funzioni separate. O usare l'operatore di commutazione ... caso

 
Artyom Trishkin:
MessageBox()

c'è un modo per fare in modo che se clicco dopo l'arrivo di una nuova spunta, non appaia una nuova finestra, ma vengano usati i valori della prima finestra?

void OnTick()
  {
 if (Orders()<1 && (1==message || !use_MessageBox)){
   ticket=OrderSend(Symbol(), OP_SELL, lot, Bid, slippage, Ask+stopLoss*Point, Bid-takeProfit*Point, "", magic, 0, Red); message=0; 
 } 
 if (Orders()<1 && (message==0 || message==2) && use_MessageBox){
 if(use_PlaySound) PlaySound ("tick");
 message=-2;
 message =MessageBox("Текст, содержащий сообщение для отображения", "Необязательный текст для отображения в заголовке", IDOK);
   }
if (Orders()<1 && (1==message || !use_MessageBox)){
   ticket=OrderSend(Symbol(), OP_SELL, lot, Bid, slippage, Ask+stopLoss*Point, Bid-takeProfit*Point, "", magic, 0, Red); message=0; 
 }

}
 
void Trailing()
{
   for (int i=OrdersTotal() - 1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
      {
         if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol())
         {
            if (OrderType() == OP_BUY)
            {
               if (Bid - OrderOpenPrice() > TrailingStop*Point)
               {
                  if (OrderStopLoss() < Bid-Point*(TrailingStop+TrailingStep) || OrderStopLoss() == 0)
                  {
                     if (!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue))
                        Print("error order modify");
                  }
               }
            }
         }
      }
   }
   
   if (OrderType() == OP_SELL)
   {
      if (OrderOpenPrice() - Ask > TrailingStop*Point)
      {
         if (OrderStopLoss() > Ask + Point * (TrailingStop+TrailingStep) || OrderStopLoss() == 0 )
         {
            if (!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+Point*TrailingStop,Digits),OrderTakeProfit(),0,Red))
               Print("error order modify");
         }
      }
   }
}
//--------------------------------------------------------

Buon pomeriggio, nei test il trailing funziona come previsto, ma nella vita reale no, o solo una volta ogni tanto, di tanto in tanto spamma con errore OrderModify errore 4108, non riesco a capire cosa c'è di sbagliato, per favore correggetelo, capisco che l'EA non seleziona correttamente gli ordini per la modifica.

Vorrei descrivere la mia EA:

Quando due MA si incrociano, apri 2 posizioni, una corta e una lunga per magia. Il corto chiude o a Takei o all'incrocio MA, il lungo dovrebbe pescare. La selezione di una posizione lunga per una rete a strascico è fatta su un numero magico.

Forse ho fatto un errore in qualche parte del codice all'apertura della posizione:

//BUY
   if (fast1>slow1&&fast2<slow2)
     {
      if (StopLoss_1>0)   sl=NormalizeDouble(Bid-StopLoss_1*Point,Digits);   else sl=0;
      if (TakeProfit_1>0) tp=NormalizeDouble(Ask+TakeProfit_1*Point,Digits); else tp=0;
      closeshrts();
      OrderSend(Symbol(),OP_BUY,Lts,NormalizeDouble(Ask,Digits),5,sl,tp,NULL,0,0,Blue);
     }
   //BUY_2
   if (fast1>slow1&&fast2<slow2)  
     {
      if (StopLoss_2>0)   sl=NormalizeDouble(Bid-StopLoss_2*Point,Digits);   else sl=0;
      if (TakeProfit_2>0) tp=NormalizeDouble(Ask+TakeProfit_2*Point,Digits); else tp=0; 
      closeshrts();
      OrderSend(Symbol(),OP_BUY,Lts,NormalizeDouble(Ask,Digits),5,sl,tp,NULL,MagicNumber,0,Blue);
     }  
     
   //SELL
   if(fast1<slow1&&fast2>slow2)
     {
      if (TakeProfit_1>0) sl=NormalizeDouble(Ask+StopLoss_1*Point,Digits);   else sl=0;
      if (StopLoss_1>0)   tp=NormalizeDouble(Bid-TakeProfit_1*Point,Digits); else tp=0;
      closelongs();
      OrderSend(Symbol(),OP_SELL,Lts,NormalizeDouble(Bid,Digits),5,sl,tp,NULL,0,0,Red);
     }
   //SELL_2
   if(fast1<slow1&&fast2>slow2)
     {
      if (TakeProfit_2>0) sl=NormalizeDouble(Ask+StopLoss_2*Point,Digits);   else sl=0;
      if (StopLoss_2>0)   tp=NormalizeDouble(Bid-TakeProfit_2*Point,Digits); else tp=0;
      closelongs();
      OrderSend(Symbol(),OP_SELL,Lts,NormalizeDouble(Bid,Digits),5,sl,tp,NULL,MagicNumber,0,Red);
     } 

Non so, forse dovrei aprire gli ordini tramite un ciclo? E come scrivere correttamente questo codice in modo da impostare gli stop e i take profit corretti? Come l'ho scritto - funziona solo per vendere, per comprare imposta lo stop a 0.

(Per favore, aiutatemi sulla strada giusta))

 
Ciao, un mio amico mi ha fatto una domanda sull'alfabeto MQL4:
Quindi le lettere cirillico - russe sono incluse nell'alfabeto?
E il punto interrogativo ???? è incluso nell'insieme dei caratteri dell'alfabeto?????
e il backslash \\\\\\\, fa parte dell'alfabeto o no?
 
entra.
 
Alexander Zhmurenko:
) entra in gioco.

Quello che ho scritto è una citazione di un conoscente. L'ho appena copiato e incollato. Sta cercando di insegnarmi MQL. Mi sto scervellando, quindi, per favore, scrivete quello che ci va.

a ) punto interrogativo ( ?)

b) backslash (\)

 
Zvezdochet:

Quello che ho scritto è una citazione di un conoscente. L'ho appena copiato e incollato. Sta cercando di insegnarmi MQL. Mi sto scervellando, quindi, per favore, scrivete quello che ci va.

a ) un punto interrogativo ( ?)

b ) barra rovesciata ( \)

L'uso dei caratteri cirillici è una caratteristica non documentata

Caratteri che possono essere usati negli ID: cifre 0-9, lettere minuscole e maiuscole a-z e A-Z, riconoscibili come caratteri diversi, carattere underscore (_). Il primo carattere non può essere un numero.

sintassi.

 
int OnInit()
  {
//---
   color желтый = clrAqua;
//---
   return(INIT_SUCCEEDED);
  }
le variabili possono anche essere
 

Ciao, potresti dirmi perché ZigD[0] non viene emesso in sommente?

   for(ww = 0; ww <= Bars-1; ww++)
  {
      zzz = iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, ww);
      
           if(zzz > 0.0)   
           {
           ZigM[kk]=zzz;
            kk++; 
           ZigD[dd]=ww;
            dd++;  
            }
   }   
Motivazione: