Lo que impide que el asesor gane dinero. - página 4

 
FAQ:

... por favor :

La mayor parte de la mitad de las variables, tanto globales como locales, no están inicializadas.

Nunca se comprueba si una orden está seleccionada por OrderSelect(), ni siquiera estamos hablando de comprobar si está abierta o cerrada en absoluto.

No he notado ninguna actualización de las cotizaciones antes de las funciones comerciales...

GetLastError no se restablece antes de abrir/cerrar, pero se comprueba - de nuevo, habrá casos de basura en la variable.

No se comprueban y normalizan los precios al cerrar

¿Quieres continuar?

Adelante.

Muy útil.

 

Aquí https://www.mql5.com/ru/forum/137651/page3 he publicado mi función de cierre

Sustituir GetInfo() por print, Fun_Error() = ErrorDescription()

 
FAQ:

Nunca se comprueba si un pedido está seleccionado por OrderSelect(),


Para ser sincero, no entiendo muy bien qué hacer si se devuelve un valor -falso- cuando se selecciona una orden.

¿Significa falso que está 100% ausente entre los MODE_TRADES?

He rediseñado los códigos de apertura de órdenes según tus recomendaciones, francamente no he tocado la configuración del Asesor Experto, así que tengo curiosidad por ver...¿Se venderá o se obtendrá otro beneficio?

 
valenok2003:


Para ser sincero, no entiendo muy bien qué hacer si se devuelve false cuando se selecciona una orden.

¿Significa falso su ausencia al 100% entre los MODE_TRADES?


significa al 100% que no se puede hacer nada con la orden porque no está seleccionada.
 
PapaYozh:

significa al 100% que no se puede hacer nada con ella [la orden] ya que no está seleccionada.



Bien... Oh, hombre... pero si no se selecciona, es un error, ¿no? Hay que hacer algo...

Por ejemplo, vea esta función,

//+-------
//+------------------------------------------------------------------+
//|   valenok2003@mail.ru                                05.07.2011
//+------------------------------------------------------------------+
//| check_open_order() ПРОВЕРКА реального открытия рыночного ордера по тикету
//| Требует:
//| - тикет ордера 
//| Возвращает тикет открытого ордера или -1
//+------------------------------------------------------------------+
int check_open_order(int _Ticket)
{  string _Function = "check_open_order(): ";
//-----------------
   if(_Ticket > 0) {  
      OrderSelect(_Ticket,SELECT_BY_TICKET);             
      if(OrderType() <= 1) {  
         output_mov_string(order_type_in_txt(OrderType())+ " успешно открыт!", Clr_Report);
         output_sound(Name_Sound_Open);
         OrderPrint();
//-----------------         
         for(int _n = 0; _n < MAX_ORDERS; _n++)  {
            // Если место свободно
            if(Arr_Tickets[_n] == 0)   {
               // Создаём запись об ордере
               Arr_Tickets[_n] = OrderTicket();
               break;
            }
         }
      }
      else _Ticket = -1;
   }
//-----------------
   return(_Ticket);
}
//+-------------------------------------------------------------------
//+-------
Si la orden no está seleccionada, debería devolver -1. Y si no se selecciona por cualquier otro motivo -por ejemplo, un fallo de algún tipo, pero la orden está abierta-, ¿qué debo hacer?
 
valenok2003:


Bien... Mierda... Pero si no se selecciona, es un error de algún tipo, ¿no? Hay que hacer algo...


Es posible que no se seleccione:

1) por un error en el código del Asesor Experto;

2) se cerró por circunstancias ajenas al control del EA (SL/TP activado, cerrado manualmente, cerrado por el EA)

 
valenok2003:


Bien... Oh, hombre... pero si no se selecciona, hay un error, ¿no? Hay que hacer algo...

¿Me estás tomando el pelo o hablas en serio?

Haga una pausa y seleccione de nuevo. Yo lo tengo organizado así, funciona en línea:

// ------------------------------------------------Ищем наш ордер---------------------------------
   int orderType;
   for (int orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--)
   {
      if (!OrderSelect(orderIndex, SELECT_BY_POS))     continue;
      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != MagicNumber)) continue;
      orderType = OrderType();
      if ((orderType != OP_BUY) && (orderType != OP_SELL)) continue;
          ticket = OrderTicket( );                         // Номер ордера
          orderLots = OrderLots();                         // Lots   
          orderProfit = OrderProfit() + OrderSwap();       // Profit
          Price = OrderOpenPrice();                        // Цена открытия рыночного ордера
          SL =  OrderStopLoss();                           // Значение StopLoss ордера
          TP = OrderTakeProfit();                          // Значение TakeProfit ордера          
          if (ticket>0)                                    // Если позиция открылась
              {
                while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
                Sleep(100);                                 
                double OpenPrice=OrderOpenPrice();
       // Print("OrderTicket()=",OrderTicket(),  "OrderOpenTime()=",OrderOpenTime()); 
       // Print("TimeLocal()=",TimeLocal());                                                                    
                     //---------------------Запоминаем значения сл и тп ордера   
...
...
...
                  
 
Roman.:

¿Me estás tomando el pelo o hablas en serio?

Haga una pausa y seleccione de nuevo. Yo lo tengo organizado así, funciona en línea:

He complementado mi puesto allí.

¿Cuántas veces tienes que elegir?

 
valenok2003:

He complementado mi puesto allí.

¿Y cuántas veces hay que elegir?

ANTES. Hasta que se seleccione en un bucle:

if (ticket>0)                                    // Если позиция открылась
              {
                while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
                Sleep(100);                                 
                double OpenPrice=OrderOpenPrice();
       // Print("OrderTicket()=",OrderTicket(),  "OrderOpenTime()=",OrderOpenTime()); 
       // Print("TimeLocal()=",TimeLocal());                                                                    
                     //---------------------Запоминаем значения сл и тп ордера                     
                if (orderType == OP_BUY) 
                   {                
                     
                   }
            
                if (orderType == OP_SELL) 
                   {        
                   
                   }   
                            
              }
 
PapaYozh:


Es posible que no se seleccione:

1) Por un error en el código de la EA;

esto es bastante claro

2) se cerró por circunstancias ajenas a la EA (el SL/TP se activó, se cerró manualmente, lo cerró la EA)

sólo estas dos razones o podría haber algo más?