Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 698

 
Vitaly Muzichenko:

Hasta que te canses de escribirlas

en serio?)
 
multiplicator:
en serio?)

Sí. Pero por regla general no se escriben más de tres, porque ese código es difícil de leer después, sobre todo si ha pasado mucho tiempo desde que se escribió. Es mejor dividir estos muchos ifs anidados en funciones separadas. O bien, utilizar el operador del interruptor ... caso

 
Artyom Trishkin:
MessageBox()

¿hay alguna forma de hacer que si hago clic después de que entre un nuevo tick, no aparezca una nueva ventana, sino que se utilicen los valores de la primera ventana?

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

Buenas tardes, en las pruebas el trailing funciona como se espera, pero en la vida real no, o solo de vez en cuando, de vez en cuando spamea con el error OrderModify error 4108, no puedo entender que es lo que está mal, por favor corríjanlo, entiendo que el EA no selecciona correctamente las órdenes para su modificación.

Me gustaría describir mi EA:

Cuando dos MAs se cruzan, abre 2 posiciones, una corta y otra larga por arte de magia. El corto se cierra en Takei o en el cruce de MA, el largo debe arrastrar. La selección de una posición larga para una red de arrastre se hace sobre el número mágico.

Tal vez haya cometido un error en alguna parte del código en la apertura de la posición:

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

No sé, ¿tal vez debería abrir las órdenes a través de un bucle? ¿Y cómo escribir correctamente este código para que se establezcan los stops y Take Profits correctos? Tal y como lo he escrito - funciona sólo para la Venta, para la Compra establece el Stop en 0.

(Por favor, ayúdenme a seguir el camino correcto))

 
Hola, un amigo me ha hecho una pregunta sobre el alfabeto MQL4:
¿Las letras cirílicas - rusas están incluidas en el alfabeto?
Y el signo de interrogación ???? está incluido en el conjunto de caracteres del alfabeto?????
y la barra invertida \\\\\\\, ¿forma parte del alfabeto o no?
 
entra.
 
Alexander Zhmurenko:
).

¿Puedes detallar lo que entra? Lo que escribí fue una cita de un conocido. Lo he copiado y pegado. Está tratando de enseñarme MQL. Me estoy devanando los sesos, así que, por favor, escribe lo que entra.

a ) signo de interrogación ( ?)

b) barra invertida (\ )

 
Zvezdochet:

¿Puedes detallar lo que entra? Lo que escribí fue una cita de un conocido. Lo he copiado y pegado. Está tratando de enseñarme MQL. Me estoy devanando los sesos, así que, por favor, escribe lo que entra.

a ) un signo de interrogación ( ?)

b ) barra invertida ( \ )

El uso de caracteres cirílicos es una característica no documentada

Caracteres que pueden utilizarse en los ID: dígitos 0-9, letras minúsculas y mayúsculas a-z y A-Z, reconocibles como caracteres diferentes, carácter de subrayado (_). El primer carácter no puede ser un número.

sintaxis.

 
int OnInit()
  {
//---
   color желтый = clrAqua;
//---
   return(INIT_SUCCEEDED);
  }
las variables también pueden ser
 

Hola, ¿podríais decirme por qué ZigD[0] no sale en algún momento?

   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++;  
            }
   }   
Razón de la queja: