¡aprender a ganar dinero aldeanos [Episodio 2] ! - página 102

 
BeerGod:

Tercer día de negociación manual, la negociación ha terminado por hoy


Enhorabuena. Tengo un montón de ventas en el euro en un retroceso hacia abajo - cerrado, en la libra - no...

50.000 centavos - se pasó - ¡ya está bien! :-)

 

Saludos.

tal vez alguien esté familiarizado con este código:

//-----------------Закрытие по истории в безубыток--------------------
   //---------------------расчет по истории ордеров номера очередной итерации----------------------------------------------- 
  Iteration = 0; // зануляем инерации перед их учетом в цикле по истории
  Sum_Loss = 0;  // суммарный убыток по этим итерациям

datetime 
Time_at_History_Current = 0,
Time_at_History_Previos = 0;     
 
 if(OrdersHistoryTotal() != 0)
   {
    for(int counter = OrdersHistoryTotal()-1; counter >= 0; counter--)
      {
       OrderSelect(counter, SELECT_BY_POS, MODE_HISTORY);
       if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
          if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
             if(OrderProfit() < 0) // если убыток по выбранному ордеру, то считаем суммарный и записываем время закрытия ордера
                                   // для последующего его анализа при подсчете количества итераций
                {
                 double lastLoss = OrderProfit();
                 Sum_Loss=Sum_Loss+lastLoss;  // считаем общий убыток по закрытым подряд убыточным ордерам
                 Time_at_History_Current = OrderCloseTime();
                } 
             
             //Print(" Time_at_History_Current_в цикле = ", TimeToStr(Time_at_History_Current, TIME_DATE|TIME_SECONDS));
             //Print(" Time_at_History_Previos_в цикле = ", TimeToStr(Time_at_History_Previos, TIME_DATE|TIME_SECONDS));
             
             if(Time_at_History_Current != Time_at_History_Previos) // если они не равны, то считаем итерации и делаем их равными
               {
                Time_at_History_Previos = Time_at_History_Current ;
                Iteration++;
                //Print("Iteration at History в условии сравнения  = ",  Iteration);
               }   
             else // они равны, то проверяем, дополнительно, наличие профита по выбранному следующему ордеру и выходим из цикла
               {
                if(OrderProfit() >= 0)
                  break;
               }
            }
         }
      }
   }

if (Sum_Loss < 0.0) { // Имеем убыток по закрытым позам
double money = Lots;
   BuyLots = GetBuyLotsSum();
        SellLots = GetSellLotsSum();
        if(BuyLots  > SellLots)money = BuyLots * 10;
        if(BuyLots  < SellLots)money = SellLots * 10;
  if (((AccountEquity() + Sum_Loss + (Sum_Loss / money)) >= AccountBalance()) && (((totalSell > 0) && (totalBuy < 1)) || ((totalSell < 1) && (totalBuy > 0)))) { // Достигли безубытка
    // Здесь какой-то код, который необходимо выполнить при достижении безубытка
        CloseAllBuy();
           CloseAllSell();
           Sum_Loss = 0.0;
           

No consigo cambiar esto: cuando se cierra una operación en menos, se abre el bucle y si la siguiente orden se cierra por encima de cero, es decir, con saldo positivo, pero menor que el negativo, se suma el más al negativo y se obtiene un nuevo valor negativo, que ya es menor.

if(OrderProfit() >= 0 && Sum_Loss < 0.0)
                  double lastLoss_two = OrderProfit();
                 Sum_Loss=Sum_Loss+lastLoss_two;  // считаем общий убыток по закрытым подряд убыточным ордерам
                 Time_at_History_Current = OrderCloseTime();
               }

Si es más negativo, a la señal, cerramos la orden y empezamos el ciclo desde el principio.

 
belck:

Hola.

Tal vez alguien esté familiarizado con este código:

Sí. Este es mi código. Ya te escribí que lo utilizo en mi martin rollover de la siguiente manera:

Si la última operación (pose) se cerró con beneficios, entonces ponemos a cero el número de vueltas (Iteración) y empezamos con el lote inicial, si está en menos,

entonces cuente el número de operaciones perdedoras consecutivas y abra en la dirección opuesta con un volumen mayor.

Se trata de una versión neta de Avalanche (véase la rama con el mismo nombre ), es decir, la orden de mercado se cierra (cuando se invierte una posición en volúmenes mayores) y la orden de mercado opuesta se abre en volúmenes mayores según el esquema de acciones. Aquí está mi parte de trabajo del código. Edítelo para adaptarlo a sus necesidades si tiene un algoritmo de exp. similar. No entiendo nada de su pregunta. Puedes preguntar independientemente de la situación en el apartado "Cualquier pregunta de novato...", sólo tienes que elaborar tu pregunta, porque nada (al menos para mí) está claro... en absoluto.

  //---------------------расчет по истории ордеров номера очередной итерации----------------------------------------------- 
  Iteration = 0; // зануляем инерации перед их учетом в цикле по истории
  Sum_Loss = 0;  // суммарный убыток по этим итерациям
  datetime 
  Time_at_History_Current = 0,
  Time_at_History_Previos = 0;      
  if(OrdersHistoryTotal() != 0)
   {
    for(int counter = OrdersHistoryTotal()-1; counter >= 0; counter--)
      {
       OrderSelect(counter, SELECT_BY_POS, MODE_HISTORY);
       if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
          if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
             if(OrderProfit() < 0) // если убыток по выбранному ордеру, то считаем суммарный и записываем время закрытия ордера
                                   // для последующего его анализа при подсчете количества итераций
                {
                 double lastLoss = OrderProfit();
                 Sum_Loss=Sum_Loss+lastLoss;  // считаем общий убыток по закрытым подряд убыточным ордерам
                 Time_at_History_Current = OrderCloseTime();
                } 
             
             //Print(" Time_at_History_Current_в цикле = ", TimeToStr(Time_at_History_Current, TIME_DATE|TIME_SECONDS));
             //Print(" Time_at_History_Previos_в цикле = ", TimeToStr(Time_at_History_Previos, TIME_DATE|TIME_SECONDS));
             
             if(Time_at_History_Current != Time_at_History_Previos) // если они не равны, то считаем итерации и делаем их равными
               {
                Time_at_History_Previos = Time_at_History_Current ;
                Iteration++;              
                //Print("Iteration at History в условии сравнения  = ",  Iteration);
               }   
             else // они равны, то проверяем, дополнительно, наличие профита по выбранному следующему ордеру и выходим из цикла
               {
                if(OrderProfit() >= 0) 
                  break;
               }
            }
         }
      }
   }
 //Print("Iteration at History = ",  Iteration, " Time_at_History_Current = ", TimeToStr(Time_at_History_Current, TIME_DATE|TIME_SECONDS),
 //      " Time_at_History_Previos = ", TimeToStr(Time_at_History_Previos, TIME_DATE|TIME_SECONDS));
       
    //-----------------------------------------------------расчет динамического канала----------------------------    
    if (Symbol() == "GBPJPY" || Symbol() == "EURJPY" || Symbol() == "USDJPY" || Symbol() == "CHFJPY" ||  Symbol() == "NZDJPY")  
      // || Symbol() == "XAUUSD" || Symbol() == "XAGUSD" || Symbol() == "EURGBP")   StopLossPips = StopLoss;    // т.к. волатильность (по АТР) другая (выше)
         {                 
           channel = (iATR(Symbol(),PERIOD_D1,Period_ATR,1)*1000)*Mul_Sl;                 
           StopLossPips = NormalizeDouble(channel,0);                                                                                                         
         }       
    else
         {                 
           channel = 10* (iATR(Symbol(),PERIOD_D1,Period_ATR,1)*10000/3)*Mul_Sl;                 
           StopLossPips = NormalizeDouble(channel,0);                                                                                                         
         }               
   TakeProfitPips=NormalizeDouble(StopLossPips*Mul_TP,0);  // расчет уровня тейка для всех инструментов по заданному значению динамического стопа        
                          
   // ------------------------------------------------Ищем наш ордер---------------------------------
   int orderType;
   for (int orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--)
   {
      if (!OrderSelect(orderIndex, SELECT_BY_POS))     continue; // если ордер не выбран, то идем на следующий открытый
      if(OrderCloseTime()!=0) 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());                                                                    
                     //---------------------Запоминаем значения сл и тп ордера                     
                if (orderType == OP_BUY) 
                   {                
                     V_StopLossPips = NormalizeDouble(OpenPrice  - (StopLossPips * Point), Digits);
                     V_TakeProfitPips = NormalizeDouble(OpenPrice + (TakeProfitPips * Point), Digits);
                   }
            
                if (orderType == OP_SELL) 
                   {        
                     V_StopLossPips = NormalizeDouble(OpenPrice  + (StopLossPips * Point), Digits);
                     V_TakeProfitPips = NormalizeDouble(OpenPrice - (TakeProfitPips * Point), Digits);
                   }   
                            
              }
             
     // Проверка на предельную просадку      
      double loss = - ((orderProfit * 100.0) / AccountBalance());
      if (loss > MaxLoss)
      {
         Print ("MaxLoss");
         CloseAllOrders(MagicNumber);
         IsExpertFailed = true;
         return (0);
      }
    
       // Проверка закрытия открытой позиции (ордера) по стоп-лоссу           
      if ( V_StopLossPips != 0 )
        {
          if (orderType == OP_BUY && Bid <=  V_StopLossPips)  { CloseAllOrders(MagicNumber); Print ("V_StopLossPips закрываем по сл = ", V_StopLossPips); }             
          if (OrderType()== OP_SELL && Ask >=  V_StopLossPips){ CloseAllOrders(MagicNumber); Print ("V_StopLossPips закрываем по сл = ", V_StopLossPips); }  
        }         
        
        // Проверка закрытия открытой позиции (ордера) по тейку        
        if ( V_TakeProfitPips != 0 && MathAbs(orderProfit) > MathAbs (Sum_Loss))
        {
          if (orderType == OP_BUY && Bid >=  V_TakeProfitPips)  { CloseAllOrders(MagicNumber); Print ("V_TakeProfitPips закрываем по ТР = ", V_TakeProfitPips); }             
          if (OrderType()== OP_SELL && Ask <=  V_TakeProfitPips){ CloseAllOrders(MagicNumber); Print ("V_TakeProfitPips закрываем по ТР = ", V_TakeProfitPips); }  
        }        
      
      
      // Если тралить, то с соответствующего номера итерации при выполнении НЕОБХОДИМОГО УСЛОВИЯ соответствующим 
      // выбранному видом трала      
      
      if (UseTrailing==1) if ((Iteration >= k)&& (MathAbs(orderProfit) > (MathAbs (Sum_Loss))))
         switch(type)
          {
           case 0:  // простой трал по аналогии учебнику - в зависимости от параметра trlinloss (тралить ли в зоне лоссов)
                   if (orderType == OP_BUY)  SampleTrailing_texbook (0, V_StopLossPips, V_TakeProfitPips); // если бай
                   if (orderType == OP_SELL) SampleTrailing_texbook (1, V_StopLossPips, V_TakeProfitPips); // если селл
                   break;
           //трал по фракталам + отступ (Indent)
           case 1: TrailingByFractals_LAVINA(ticket,signal_period,Sum_Loss,Lots_New,V_StopLossPips,trlinloss); break; 
            //трал по теням N свечей + отступ (Indent)       
           case 2: TrailingByShadows  (ticket,signal_period,Sum_Loss,Lots_New,V_StopLossPips,trlinloss);  break;   
          }           
       

P.D. Me vas a quitar todo el robot de batalla de las manos, que me estoy comiendo ahora mismo. Llevo trabajando en él con interrupciones y salidas a algoritmos adecuados desde septiembre de 2010. Ver hilo - Avalancha.

 

Continuación del código en el remolque ya que es más grande que el tamaño permitido:

 
     
Archivos adjuntos:
itdakxijrxj.mq4  11 kb
 
Roman.:

Sí. Este es mi código. Ya te escribí que lo utilizo en mi martin rollover de la siguiente manera:

Si la última operación (pose) se cerró con beneficios, entonces ponemos a cero el número de vueltas (Iteración) y empezamos con el lote inicial, si está en déficit,

calculamos el número de operaciones perdedoras seguidas y abrimos en sentido contrario aumentando el volumen.

Se trata de una versión neta de Avalanche (véase la rama con el mismo nombre ), es decir, la orden de mercado se cierra (en el cambio de posición en volúmenes mayores) y la orden de mercado opuesta se abre en volúmenes mayores en función del esquema de acciones. Aquí está mi parte de trabajo del código. Edítelo para adaptarlo a sus necesidades si tiene un algoritmo de exp. similar. No entiendo nada de su pregunta. Puedes preguntarlo independientemente de la situación en la rama "Cualquier pregunta de novato...", pero describe tu pregunta con más claridad, porque nada (al menos para mí) está claro... en absoluto.

P.D. Así es como vas a atraer a todo mi robot de batalla, del que estoy comiendo. Llevo trabajando en él con interrupciones y salidas a algoritmos adecuados desde septiembre de 2010. Ver hilo - Avalancha.


Ya he preguntado en el hilo de "cualquier pregunta de novato" y hay silencio.

La situación es que cuando este código cierra la operación en pérdida, recuerda el saldo negativo, y cuando cierra la operación en el plus, y el plus es menor que el saldo, pone a cero la Suma_Pérdida, y necesito que no se ponga a cero, y se acote.

Así es como funciona ahora:

comprueba una orden cerrada, si el beneficio de la orden cerrada es menor que cero, entonces este beneficio se añade a la Suma_Pérdida, y así sucesivamente hasta que el beneficio de la operación abierta supere (será mayor que) la Suma_Pérdida, cuando se alcanza, la operación se cierra, y la Suma_Pérdida se pone a cero y el ciclo comienza de nuevo.

Lo necesito:

orden cerrada en negativo, su beneficio negativo se añade a la Suma_Pérdida, entonces si la siguiente operación se cierra con un beneficio positivo, la Suma_Pérdida se reduce en la cantidad derivada del beneficio, lo que significa que la siguiente orden abierta Suma_Pérdida ya es una cantidad menor, y así sucesivamente hasta que el beneficio de la orden es mayor que la Suma_Pérdida, y entonces se borra la Suma_Pérdida y comienza un nuevo ciclo.

Suma_Pérdida = 0;

1ª orden cerrada: Beneficio (-50) < 0

Suma_Pérdida + beneficio (Suma_Pérdida + (-50))

Suma_Pérdida = -50;

2ª orden cerrada: Beneficio (+40) > 0 y Suma_Pérdida < 0

Suma_Pérdida + beneficio (Suma_Pérdida + 40)

Suma_Pérdida = -10

 
belck:

1. Ya he abordado el hilo "cualquier pregunta de principiante" y hay silencio.

La situación es que cuando este código cierra una operación en pérdidas, recuerda el saldo negativo, pero cuando cierra una operación en beneficios, y el plus es menor que el saldo, reinicia Sum_Loss, pero necesito que no se reinicie, sino que se segue.

2. Así que, ahora mismo, esto es como funciona:

comprueba una orden cerrada, si el beneficio de la orden cerrada es menor que cero, entonces este beneficio se añade a la Suma_Pérdida, y así sucesivamente hasta que el beneficio de la operación abierta no supere (será mayor que) la Suma_Pérdida, cuando se alcanza, la operación se cierra, y la Suma_Pérdida se reinicia y el ciclo comienza de nuevo.

3. Necesito:

La orden se cerró con un negativo, su beneficio negativo se añadió a la Suma_Pérdida; entonces, si la siguiente operación se cerró con un beneficio positivo, la Suma_Pérdida se reduce en la cantidad recibida del beneficio; esto significa que la siguiente operación abierta recibirá una cantidad menor de Suma_Pérdida, y así sucesivamente, hasta que el beneficio de la orden sea mayor que la Suma_Pérdida, y entonces la Suma_Pérdida se borra y comienza un nuevo ciclo.

Suma_Pérdida = 0;

1ª orden cerrada: Beneficio (-50) < 0

Suma_Pérdida + beneficio (Suma_Pérdida + (-50))

Suma_Pérdida = -50;

2ª orden cerrada: Beneficio (+40) > 0 y Suma_Pérdida < 0

Suma_Pérdida + beneficio (Suma_Pérdida + 40)

Suma_Pérdida = -10

1. solicitar de nuevo: hay personas que sin duda le ayudarán. Habiendo puesto previamente su código en esa rama... (tal cual)

2. Así es, porque este es el algoritmo básico de Avalanche.

3. Todo esto y descríbelo en el hilo para principiantes con tu código para este algoritmo. La gente lo corregirá. Empieza a escribir código en mcl4 tú mismo de forma constante y tranquila.

Si no puedes hacerlo por ti mismo, ve a la sección de "Trabajos" del quinto foro, allí escriben por comida...

¡Escribiré el código desde cero de forma gratuita SÓLO si tiene interés personal!

Todo.

 

Puedes exhalar... :-)

Un montón de pedidos esta vez... :-) ¡cerrado con beneficios!

DoublePlus y vse_dlya_sela_J_OsMA_kh búhos + mi variante (también con la descripción de TS) con la configuración - en la rama.

 
Roman.:

Puedes exhalar... :-)

Un montón de pedidos esta vez... :-) ¡cerrado con beneficios!

DoublePlus y vse_dlya_sela_J_OsMA_kh búhos + mi variante (también con la descripción de TS) con la configuración - en la rama.


¿Y tú personalmente sabes programar?

No soy un gran programador.

¿Tal vez aún puedas ayudarme a completar el código?

 
Roman.:

Puedes exhalar... :-)

Un montón de pedidos esta vez... :-) ¡cerrado con beneficios!

¿Y lamenta que no se hayan añadido lotes antes del beneficio? :))
 
belck:

No soy un gran programador.

¿Tal vez puedas ayudarme a terminar el código después de todo?

Si no puedes hacerlo tú mismo, ponte en contacto con el servicio "Jobs" de mql5.com: te harán todos los caprichos rápidamente.
Razón de la queja: