学习如何赚取村民的钱 [第2集] ! - 页 102

 

问候。

也许有人对这个代码很熟悉。

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

你好。

也许有人熟悉这个代码。

是的,这是我的代码。我已经给你写过,我在我的翻身马汀中使用了它,如下所示。

如果最后一笔交易(pose)是盈利的,那么我们将翻转次数清零(Iteration)并从起始手数开始,如果是负数。

然后计算连续亏损的交易数量,并以增加的成交量向相反方向开仓。

这是Avalanche 的净值化版本(见同名 分支),即市场订单被关闭(当在增加的交易量上逆转头寸时),相反的市场订单在更大的交易量上被打开,这取决于股票计划。下面是我的工作部分的代码。如果你有类似的exp算法,可以根据你的需要编辑它。我不明白你的问题中的任何内容。你可以在 "任何新手问题...... "中不分情况地问,只要详细说明你的问题,因为没有什么(至少对我来说)是清楚的--根本没有。

  //---------------------расчет по истории ордеров номера очередной итерации----------------------------------------------- 
  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.S.你要把我所有的战斗机器人从我手中拿走,我现在正在吃。自2010年9月以来,我一直在为适当的算法而中断和退出工作。见主题--雪崩。

 

继续在拖车中的代码,因为它比允许的尺寸大。

 
     
附加的文件:
itdakxijrxj.mq4  11 kb
 
Roman.:

是的,这是我的代码。我已经给你写过,我在我的翻身马汀中使用了它,如下所示。

如果最后一笔交易(pose)是以盈利方式结束的,那么我们就将翻转次数清零(Iteration),并从起始手数开始,如果是亏损。

我们计算出连续亏损的交易数量,并通过增加交易量向相反方向开仓。

这是Avalanche 的净值化版本(见同名 分支),即市场订单被关闭(在成交量增加时翻转位置),相反的市场订单根据股票计划在更大的成交量上被打开。下面是我的工作部分的代码。如果你有类似的exp算法,可以根据你的需要编辑它。我不明白你的问题中的任何内容。你可以在 "任何新手问题...... "分支中不分情况地提问,但要更详细地描述你的问题,因为没有什么(至少对我来说)是清楚的--根本没有。

P.S.这就是你要引出我所有的战斗机器人,我正在吃手。自2010年9月以来,我一直在为适当的算法而中断和退出工作。见主题--雪崩。


我已经在 "任何新手问题 "的主题中问过了,但大家都沉默不语。

情况是,当这段代码在损失中关闭交易时,它记住了减去的余额,而当它在加号中关闭交易时,加号小于余额,它将Sum_Loss归零,而我需要它不归零,并刈割。

所以这就是现在的工作方式。

它检查一个已关闭的订单,如果已关闭的订单的利润小于零,那么这个利润将被添加到Sum_Loss中,以此类推,直到开放交易的利润超过(将超过)Sum_Loss,当达到时,交易被关闭,Sum_Loss被清零,循环重新开始。

我需要。

订单以负数收盘,其负数利润被加到Sum_Loss中,然后如果下一笔交易以正数利润收盘,Sum_Loss被减去从利润中得到的金额,这意味着下一笔开仓订单Sum_Loss已经是一个较小的金额,以此类推,直到订单利润高于Sum_Loss,然后Sum_Loss被清除,一个新的循环开始。

Sum_Loss = 0。

第一笔平仓单:利润(-50)< 0

Sum_Loss + profit (Sum_Loss + (-50))

Sum_Loss = -50。

第二笔平仓单:利润(+40)>0且Sum_Loss<0

Sum_Loss + profit (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。

第一笔平仓单:利润(-50)< 0

Sum_Loss + profit (Sum_Loss + (-50))

Sum_Loss = -50。

第二笔平仓单:利润(+40)>0且Sum_Loss<0

Sum_Loss + profit (Sum_Loss + 40)

Sum_Loss = -10

1.再次申请--那里的人肯定会提供帮助。 之前把你的代码放在该分支中...(事实如此)

2.这是正确的,因为这是Avalanche的基本算法。

3.所有这些,并在初学者的主题中描述它与你的这个算法的代码。人们会纠正它。自己开始在mcl4上持续而安静地写代码。

如果你不能自己做,可以去第五论坛的 "工作 "部分 - 他们在那里写食物...

只有在你有个人兴趣的情况下,才会免费从头开始写代码!

一切都是。

 

你可以呼出...:-)

这次有一大堆订单...:-)收盘时获利!

DoublePlus和vse_dlya_sela_J_OsMA_kh猫头鹰+我的变体(也有TS的描述)与设置 - 在分支。

 
Roman.:

你可以呼出...:-)

这次有一大堆订单...:-)收盘时获利!

DoublePlus和vse_dlya_sela_J_OsMA_kh猫头鹰+我的变体(也有TS的描述)与设置 - 在分支。


而你个人知道如何编程?

我不是什么程序员。

也许你还能帮我完成代码?

 
Roman.:

你可以呼出...:-)

这次有一大堆订单...:-)收盘时获利!

而遗憾的是,在获利之前没有增加手数?:))
 
belck:

我不是什么程序员。

也许你终究能帮我完成代码?

如果你不能自己做,请联系mql5.com的 "工作 "服务--他们会迅速完成你所有的奇思妙想。
 
Roman.:
这很好。
PS:除了我们,所有的交易者都在睡觉。