[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No podría ir a ningún sitio sin ti - 2. - página 497

 
Por favor, indique cómo abrir una orden en una nueva barra sólo una vez ????
 

incrustar el código en el EA, tenía algo así hasta que lo borré, estaba usando el marco de tiempo por hora

orderelect - selecciona el último pedido en el historial

tomar la hora de su cierre y sacar la hora de cierre

y antes de abrir la orden, establezca una condición para que la hora actual NO sea igual a la hora de cierre de la orden desde el historial

 

Por favor, ayúdenme con este problema, mi variable TP se convierte en cero después de la segunda actualización del precio, es decir, el asesor abre una orden, y el TP y el Bid no son ambos iguales a cero, entonces el precio se actualiza de nuevo y el TP es cero, aunque esto no está en el código, tuve un problema con el arrastre de SL, pero ahora resulta que el problema está en la definición de TP

int start()
{
//----
double TP;
double SL;
if (OrdersTotal()==0)
{
OrderSend(Symbol(),OP_BUY,0.01,Ask,3,0,Bid+4*Point);
OrderSelect(OrdersTotal()-1,SELECT_BY_POS);
TP=OrderTakeProfit();
}
Alert ("TP=" + TP);
Alert ("Bid=" + Bid);
if (OrdersTotal()>0)
{
if (TP-Bid<3*Point)
{
Alert ("Approaching TP by 1 or 2");
Alert ("TP=" + TP);
Alert ("Bid=" + Bid);
}
}
//----
return(0);
}

 
LazarevDenis:

Por favor, ayúdenme con este problema, mi variable TP se pone a cero después de la segunda actualización del precio, es decir, el EA abre una orden y muestra los valores de TP y Bid, ambos no son iguales a cero, entonces el precio se actualiza de nuevo y el TP es cero, aunque en el código, no hay tales comandos, tuve un problema con tirar de SL hacia arriba, pero ahora resulta que el problema está en la definición de TP

double TP, SL;


int start()
{
//----

if (OrdersTotal()==0)
{
OrderSend(Symbol(),OP_BUY,0.01,Ask,3,0,Bid+4*Point);
OrderSelect(OrdersTotal()-1,SELECT_BY_POS);
TP=OrderTakeProfit();
}
Alert ("TP=" + TP);
Alert ("Bid=" + Bid);
if (OrdersTotal()>0)
{
if (TP-Bid<3*Point)
{
Alert ("Приблизился к ТП на 1 или 2");
Alert ("TP=" + TP);
Alert ("Bid=" + Bid);
}
}
//----
return(0);
}
Inténtalo de esta manera...
 
VOLDEMAR:
Por favor, indique cómo abrir una orden en una nueva barra sólo una vez ????

Lea aquí: https://www.mql5.com/ru/forum/134437
 
Cmu4, muchas gracias, has sido de gran ayuda
 

Hola a todos.

Hay dos señales en la estrategia: una primaria y otra secundaria. Una operación se abre cuando la segunda señal aparece a más tardar 12 horas después. Pregunta: ¿Cómo puedo enseñar a mi Asesor Experto a no reaccionar a la señal, si aparece después de 12 horas? Por favor, si puede dar un ejemplo de código concreto

 
demlin:

Hola a todos.

Hay dos señales en la estrategia: una primaria y otra secundaria. Una operación se abre cuando la segunda señal aparece a más tardar 12 horas después. Pregunta: ¿Cómo puedo enseñar a mi Asesor Experto a no reaccionar a la señal, si aparece después de 12 horas? Por favor, si puedes darme un ejemplo del código


Hola Dmitry. Por mi parte, estoy dispuesto a ofrecerle la siguiente variante. Por analogía, véase la activación de los criterios de negociación de este artículo - también hay dos señales - a saber - véase después de la segunda figura "Lo primero que hay que esperar en el gráfico de DeMarker es el momento en que el DeMarker cruza las líneas de MA rápida y lenta alrededor de 0,7 para una posición corta. Esta es la primera señal preliminar. Luego esperamos el cruce de las propias líneas MA. Esta es la señal principal, tras la cual se pueden realizar las lecturas del indicador Taichi. Si las líneas MA no se cruzan, se considera una señal falsa y el movimiento del precio continuará. Aquí es cómo se implementa en mi código - en la inclusión de búhos que son responsables de la activación de los criterios de comercio.

El truco principal es trabajar a través de los dos de abajo (al final de) la inclusión mediante el establecimiento y restablecimiento de las banderas cuando uno u otro criterio de comercio se activa.

//--------------------------------------------------------------------
// Criterion.mqh
// 
//--------------------------------------------------------------- 1 --
// Функция вычисления торговых критериев.
// Возвращаемые значения:
// 10 - открытие Buy  
// 20 - открытие Sell 
// 0  - значимых критериев нет
// 
//--------------------------------------------------------------- 2 --
// Внешние переменные:
extern string A5 = "Параметры";
//extern int       Period_K = 5;            // Период K
//extern int       Period_D = 3;            // Период D
//extern int       Slowing = 3;             // Замедление

extern int Tenkan=9;
extern int Kijun=26;
extern int Senkou=52;
extern int FlatSE=7;

extern int DeMarker=25;
extern int FastMA=14;
extern int SlowMA=25;
extern double DeMarker_OpenLevel_Sell = 0.7;
extern double DeMarker_OpenLevel_Buy = 0.7;
 bool   DeMarker_Buy_signal=false, DeMarker_Sell_signal=false,
       MA_Buy_signal=false, MA_Sell_signal=false;



extern int t_trend_period =6; // для оптимизации по всем периодам от 0 до 7 шаг 1
                              // на каком ТФ работаем: 1-М1, 2-М5, 3-М15, 4-М30, 5-Н1, 6 - Н4, 7-день
 

//--------------------------------------------------------------- 3 --
int Criterion()                        // Пользовательская функция
  {
  //--------------------------------------------------------------- 4 --
 int trend_period=GetPeriod(t_trend_period); // для выбора оптимального значения рабочего ТФ

   // Параметры технич. индикат:
                 
double Taichi_1 = iCustom (Symbol(), trend_period, "Cronex Taichi",Tenkan, Kijun, Senkou, FlatSE, 0, 1);
double TaichiFor_1 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 3, 1);
double Signal_1 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 1, 1);
double SSignal_1 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 2, 1);

double FlatBuffer1 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 4, 1);
double FlatBuffer2 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 5, 1);

double DeMarker_1 = iCustom (Symbol(), trend_period, "Cronex DeMarker",DeMarker, FastMA, SlowMA, 0, 1);
double DeMarker_2 = iCustom (Symbol(), trend_period, "Cronex DeMarker",DeMarker, FastMA, SlowMA, 0, 2);

double FastMA_1 = iCustom (Symbol(), trend_period, "Cronex DeMarker", DeMarker, FastMA, SlowMA, 1, 1);
double FastMA_2 = iCustom (Symbol(), trend_period, "Cronex DeMarker", DeMarker, FastMA, SlowMA, 1, 2);

double SlowMA_1 = iCustom (Symbol(), trend_period, "Cronex DeMarker", DeMarker, FastMA, SlowMA, 2, 1);
double SlowMA_2 = iCustom (Symbol(), trend_period, "Cronex DeMarker", DeMarker, FastMA, SlowMA, 2, 2);

//--------------------------------------------------------------- 5 --
   // Вычисление торговых критериев
   
   if(( (type_op_DeMarker(DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_BUY) || (DeMarker_Buy_signal == true && DeMarker_Sell_signal==false)) &&  // когда DeMarker пересекает медленую (выше уровня бай (0.7)) для лонг
      ( (type_op_MA (DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_BUY) || (MA_Buy_signal==true && MA_Sell_signal==false)) && // пересечение МА DeMarkers
   
   
      (iClose(Symbol(), trend_period,1) > Taichi_1 && Taichi_1 > TaichiFor_1 && Signal_1 > SSignal_1 && FlatBuffer1==0 && FlatBuffer2==0))
     
         {
           Print ("Taichi_1 = ", Taichi_1, "TaichiFor_1 = ",TaichiFor_1, "Signal_1 = ", Signal_1, "SSignal_1 = ",SSignal_1, "FlatBuffer1 = ", FlatBuffer1, "FlatBuffer2 = ", FlatBuffer2);
           Print ("DeMarker_1 = ", DeMarker_1, "DeMarker_2 = ",DeMarker_2, "FastMA_1 = ", FastMA_1, "FastMA_2 = ",FastMA_2, "SlowMA_1 = ", SlowMA_1, "SlowMA_2 = ", SlowMA_2);
           return(10);                      // Открытие Buy    
         }
        
   if(( (type_op_DeMarker(DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_SELL) || (DeMarker_Buy_signal==false && DeMarker_Sell_signal==true)) &&  // когда DeMarker пересекает медленую (ниже уровня селл) для шорт
      ( (type_op_MA (DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_SELL) || (MA_Buy_signal==false && MA_Sell_signal==true)) && // пересечение МА DeMarkers
        
      (iClose(Symbol(), trend_period,1) < Taichi_1 && Taichi_1 < TaichiFor_1 && Signal_1 < SSignal_1 && FlatBuffer1==0 && FlatBuffer2==0))
        {
           Print ("Taichi_1 = ", Taichi_1, "TaichiFor_1 = ",TaichiFor_1, "Signal_1 = ", Signal_1, "SSignal_1 = ",SSignal_1, "FlatBuffer1 = ", FlatBuffer1, "FlatBuffer2 = ", FlatBuffer2);
           Print ("DeMarker_1 = ", DeMarker_1, "DeMarker_2 = ",DeMarker_2, "FastMA_1 = ", FastMA_1, "FastMA_2 = ",FastMA_2, "SlowMA_1 = ", SlowMA_1, "SlowMA_2 = ", SlowMA_2);
           return(20);  
        }                       // Открытие Sell 
  
//--------------------------------------------------------------- 6 --
   return(0);                          // Выход из пользов. функции
  }
//--------------------------------------------------------------- 7 --

//для оптимизации по всем ТФ
int GetPeriod(int period)
{int periodres;
 switch(period)
  {
   case 1: periodres=1;break;
   case 2: periodres=5;break;
   case 3: periodres=15;break;
   case 4: periodres=30;break;
   case 5: periodres=60;break;
   case 6: periodres=240;break;
   case 7: periodres=1440;break;
   case 8: periodres=10080;break;
   default: periodres=1;break;
  }
return(periodres);
} 


int type_op_DeMarker(double D1, double D2, double F1, double F2, double S1,double S2)// Функция - условия для входа в рынок и сохранения их через переменные Buy_signal и Sell_signal (даже после их сработки - до отмены
               // противоположными сигналами)
               
{
      
     if (D2-S2 < 0 && D1-S1 > 0 && D1 > F1  && D1 < DeMarker_OpenLevel_Buy)
          {
             DeMarker_Buy_signal=true;
             DeMarker_Sell_signal=false;
             return(OP_BUY);
          } 
  
      if (D2-S2 > 0 && D1-S1 < 0 && D1 < F1 && D1 > DeMarker_OpenLevel_Sell)                                                                                   
          {
             DeMarker_Buy_signal=false;
             DeMarker_Sell_signal=true;
             return(OP_SELL);
          }   
   else return(-1);
     
}

int type_op_MA(double d1, double d2, double f1, double f2, double s1,double s2) // условия для входа в рынок и сохранения их через переменные Buy_signal и Sell_signal (даже после их сработки - до отмены
               // противоположными сигналами)
               

  {
          
     if (f2 - s2 < 0 && f1 - s1 > 0)
          {
             MA_Buy_signal=true;
             MA_Sell_signal=false;
             return(OP_BUY);
          } 
  
      if (f2-s2 > 0 && f1-s1 < 0)                                                                                                               
          {
             MA_Buy_signal=false;
             MA_Sell_signal=true;
             return(OP_SELL);
          }   
   else return(-1);

  }

Además, guardará la hora actual cuando se active el criterio principal utilizando TimeCurrent, es decir, especificará una expresión de tipo x = TimeCurrent antes dereturn(OP_BUY); oreturn(OP_SELL); donde x es una variable global de tipo datetime por analogía en la primera funciónint_op_DeMarker. Luego haz lo mismo con la segunda funciónint type_op_MA... - allí se memoriza la variable y = TimeCurrent;

A continuación, en el bloque de cálculo de los criterios comerciales se compara el valor de estas dos variables con el signo más (resulta que no es necesario el análogo de trabajar con valores UTC - en su lugar se toma una comparación de tiempo de recepción de sus dos señales comerciales):

 // Вычисление торговых критериев
   
   if(( (type_op_DeMarker(DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_BUY) || (DeMarker_Buy_signal == true && DeMarker_Sell_signal==false)) &&  // когда DeMarker пересекает медленую (выше уровня бай (0.7)) для лонг
      ( (type_op_MA (DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_BUY) || (MA_Buy_signal==true && MA_Sell_signal==false)) && // пересечение МА DeMarkers
   
   
      ((x+43200) < y )) //43200 - это количество секунд в 12-ти часах
     
         {
           Print ("Время сработки первого условия х(в секундах) = ", х, " Время сработки второго условия y (в секундах) = ", y);
           Print ("DeMarker_1 = ", DeMarker_1, "DeMarker_2 = ",DeMarker_2, "FastMA_1 = ", FastMA_1, "FastMA_2 = ",FastMA_2, "SlowMA_1 = ", SlowMA_1, "SlowMA_2 = ", SlowMA_2);
           return(10);                      // Открытие Buy    
         }

P.D. Además te envío una función para la posibilidad de optimizar el valor del TF de trabajo.

P.P.S. Así es como se organiza esta estructura de código en mi código. No excluyo que haya variantes de código mucho mejores para cumplir esas condiciones del EA. :-)))

 

¿Cómo puedo calcular el beneficio de un par de divisas en mi EA?

Por ejemplo, tengo siete órdenes de compra abiertas en euros a diferentes precios. ¿Cómo puedo calcular un beneficio en euros sin afectar a otras órdenes en otros pares? ????

 

usar SelectOrder para escanear todas las órdenes abiertas

comprobar el par requerido (OrderSymbol)

entonces añade el beneficio a cualquier variable si es el OrderProfit requerido

aquí hay un enlace con funciones útiles https://docs.mql4.com/ru/trading/OrderSelect

en el lado izquierdo hay un menú con operaciones, todas ellas están descritas allí