учитесь зарабатывать селяне [Эпизод 2] ! - страница 102

 
BeerGod:

Третий день ручной торговли, на сегодня торговля окончена


Позравляю! У меня пачка селлов по евро на откате вниз - закрыта, по фунту - нет...

50 000 cent - перемахнул - уже хорошо! :-)

 

приветствую.

возможно кому то знаком такой код:

//-----------------Закрытие по истории в безубыток--------------------
   //---------------------расчет по истории ордеров номера очередной итерации----------------------------------------------- 
  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;
           

ни как не получается у меня сделать, что бы когда была закрыта сделка в минус, то открывался цикл, и если следующий ордер закрылся больше нуля, тоесть положительный баланс, но меньше отрицательного, то мы к отрицательному прибавляем плюс, и получаем новое отрицательное значение, которое уже меньше.

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

а если больше отрицательного, по сигналу, то закрываем ордер и начинаем цикл с начала.

 
belck:

приветствую.

возможно кому то знаком такой код:

Да. Это мой код. Я же уже писал Вам, что использую его у себе в переворотном мартине следующим образом:

Если крайняя сделка (поза) была закрыта в плюс, то обнуляем количество переворотов (Iteration) и стартуем стартовым лотом, если в минус,

то считаем количество подряд убыточных сделок и открываемся в противоположную сторону увеличенным объёмом.

Это - неттинговая версия Лавины (см. одноимённую ветвь), т.е. закрывается (при перевороте позы на увеличенных объёмах) рыночный ордер и открывается противоположный рыночный на бОльших объёмах в зависимости от схемы доливок. Вот мой рабочий участок кода. Правьте под свои нужды, если у Вас подобный алгоритм экспа. Я толком ничего не понял в Вашем вопросе. Можете вне зависимости от ситуации поинтересоваться в ветке "Любой вопрос новичка...", только подробнее распишите Ваш вопрос, а то ничего (мне, по крайней мере) не понятно - вообще.

  //---------------------расчет по истории ордеров номера очередной итерации----------------------------------------------- 
  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;   
          }           
       

П.С. Вы у меня так выманите всего моего боевого робота, с рук которого я щас ем. Работал над ним с перерывами и выходами на соответствующие алгоритмы с сентября 2010 года. См. ветку - Лавина.

 

Продолжение кода в прицепе, т.к. он больше допустимого размера:

 
     
Файлы:
itdakxijrxj.mq4  11 kb
 
Roman.:

Да. Это мой код. Я же уже писал Вам, что использую его у себе в переворотном мартине следующим образом:

Если крайняя сделка (поза) была закрыта в плюс, то обнуляем количество переворотов (Iteration) и стартуем стартовым лотом, если в минус,

то считаем количество подряд убыточных сделок и открываемся в противоположную сторону увеличенным объёмом.

Это - неттинговая версия Лавины (см. одноимённую ветвь), т.е. закрывается (при перевороте позы на увеличенных объёмах) рыночный ордер и открывается противоположный рыночный на бОльших объёмах в зависимости от схемы доливок. Вот мой рабочий участок кода. Правьте под свои нужды, если у Вас подобный алгоритм экспа. Я толком ничего не понял в Вашем вопросе. Можете вне зависимости от ситуации поинтересоваться в ветке "Любой вопрос новичка...", только подробнее распишите Ваш вопрос, а то ничего (мне, по крайней мере) не понятно - вообще.

П.С. Вы у меня так выманите всего моего боевого робота, с рук которого я щас ем. Работал над ним с перерывами и выходами на соответствующие алгоритмы с сентября 2010 года. См. ветку - Лавина.


я уже обращался в ветку "любой вопрос новичка" и там тишина.

Ситуация в том, что когда данный код закрывает сделку в убыток, то он запоминает минусовой баланс, а когда закрывает сделку в плюс, и при этом плюс меньше баланса, то он обнуляет Sum_Loss, а мне надо, что бы он не обнулял, а скосил.

то есть, сейчас он вот как работает:

проверяет закрытый ордер, если у закрытого ордера профит меньше нуля, то этот профит приплюсовывается к Sum_Loss, и так до тех пор, пока профит открытой сделки не превысит (будет больше) Sum_Loss, при достижении сделка закрывается, и Sum_Loss обнуляется и начинает работать цикл сначала.

а мне нужно:

ордер закрылся в минус, его профит минусовой прибавился к Sum_Loss, после если следующая сделка закрылась с профитом положительным то уменьшаем сумму Sum_Loss на сумму полученную от прибыльного профита, а значит следующему открытому ордеру Sum_Loss достается уже с меньшей суммой, и так до тепх пор, пока прибыль от ордеров станет больше Sum_Loss, и тогда Sum_Loss обнуляем и начинаем новый цикл.

Sum_Loss = 0;

1-й закрытый ордер: профит (-50) < 0

Sum_Loss + профит (Sum_Loss + (-50))

Sum_Loss = -50;

2-й закрытый ордер: профит(+40) > 0 и Sum_Loss < 0

Sum_Loss + профит (Sum_Loss + 40)

Sum_Loss = -10

 
belck:

1. я уже обращался в ветку "любой вопрос новичка" и там тишина.

Ситуация в том, что когда данный код закрывает сделку в убыток, то он запоминает минусовой баланс, а когда закрывает сделку в плюс, и при этом плюс меньше баланса, то он обнуляет Sum_Loss, а мне надо, что бы он не обнулял, а скосил.

2. то есть, сейчас он вот как работает:

проверяет закрытый ордер, если у закрытого ордера профит меньше нуля, то этот профит приплюсовывается к Sum_Loss, и так до тех пор, пока профит открытой сделки не превысит (будет больше) Sum_Loss, при достижении сделка закрывается, и Sum_Loss обнуляется и начинает работать цикл сначала.

3. а мне нужно:

ордер закрылся в минус, его профит минусовой прибавился к Sum_Loss, после если следующая сделка закрылась с профитом положительным то уменьшаем сумму Sum_Loss на сумму полученную от прибыльного профита, а значит следующему открытому ордеру Sum_Loss достается уже с меньшей суммой, и так до тепх пор, пока прибыль от ордеров станет больше Sum_Loss, и тогда Sum_Loss обнуляем и начинаем новый цикл.

Sum_Loss = 0;

1-й закрытый ордер: профит (-50) < 0

Sum_Loss + профит (Sum_Loss + (-50))

Sum_Loss = -50;

2-й закрытый ордер: профит(+40) > 0 и Sum_Loss < 0

Sum_Loss + профит (Sum_Loss + 40)

Sum_Loss = -10

1. Обращайтесь ещё раз - там люди обязательно помогут... предварительно выложив в ту ветвь Ваш код... (какой есть)

2. Всё верно, т.к. это базовый алгоритм Лавины.

3. Всё это и расписывайте в новичковской ветке с Вашим кодом этого алгоритма. Люди - поправят. Сами начинайте последовательно и спокойно писать код на мкл4.

Если не справляетесь сами, обращайтесь в раздел "Работа" на пятом форуме - там пишут за еду...

На халяву с нуля код будут писать ТОЛЬКО при наличии личного интереса!

Всё.

 

Можно выдохнуть... :-)

Пачки ордеров в этот раз... :-) закрыты в профит!

Совы DoublePlus и vse_dlya_sela_J_OsMA_kh + мой вариант (также с описанием ТС) с настройками - в ветке.

 
Roman.:

Можно выдохнуть... :-)

Пачки ордеров в этот раз... :-) закрыты в профит!

Совы DoublePlus и vse_dlya_sela_J_OsMA_kh + мой вариант (также с описанием ТС) с настройками - в ветке.


а ты сам лично умеешь программировать?

я слабо программирую.

может у тебя получится все же помочь мне завершить код?

 
Roman.:

Можно выдохнуть... :-)

Пачки ордеров в этот раз... :-) закрыты в профит!

И жалеется, что лотов не добавлено перед профитом? :))
 
belck:

я слабо программирую.

может у тебя получится все же помочь мне завершить код?

Сам не шАришь - обращайся в сервис "Работа" на mql5.com - там быстро выполнят все капризы.
Причина обращения: