[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 393

 
Reshetov:

В тестере и на чарте файлы пишутся и читаются в разных каталогах:

  1. MetaTrader 4\tester\experts\files
  2. MetaTrader 4\experts\files

Юрий, респект! Теперь понял, и исправил.

Zhunko, спасибо. Попробовал так, но получил ошибку, что-то типа can not read binary data from string file, или что-то в этом роде. В любом случае, моя конструкция работает.

 
snail09_1:

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

А можете показать это в коде???

Т.е как это можно реализовать?

 

Добрый день всем!

Возможно вопрос не совсем для новичка, но другой ветки не нашел, где можно задать вопрос:

каким образом можно выгрузить из MetaTrader 4 детализированный отчет, чтобы на графике был не баланс, а эквити? Или не выгрузить из MT4 а каким либо иным удобным способом реально ли это сделать? Ато торгуют совы, баланс толку нет смотреть - главное какие просадки дают.

Спасибо большое!!

 
belous:

А можете показать это в коде???

Т.е как это можно реализовать?

Ну как-то так

int ticket;

for(int z=OrdersTotal()-1;z>=0;z--)
   {
   if(!OrderSelect(z,SELECT_BY_POS))
      {
      _GetLastError=GetLastError();
      Print(" OrderSelect(",z,",SELECT_BY_POS)-Error #",_GetLastError);
      continue;
      }
   if(OrderMagicNumber()==magic && OrderSymbol()==Symbol())
      {
      if((OrderType()==OP_BUY)||(OrderType()==OP_SELL))
          {
          // Проверим условие для закрытия, и если истинно          
              {
              ticket=OrderTicket();
              //Закрываем его
              }
           }
       }
    }
 

помогите плиииз.

вот код


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

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


Ситуация в том, что когда данный код закрывает сделку в убыток, то он запоминает минусовой баланс, а когда закрывает сделку в плюс, и при этом плюс меньше баланса, то он обнуляет 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


Может нужно как то переменную Sum_Loss указывать отрицательной? в общим я запутался. перепробовал много вариантов, а правильного результата так и не получил. Хоть направте меня в правильном напровлении, подскажите что да как нужно сделать, а то я чето не допойму.
 
Как протестировать советник без учета спрэда? Такое возможно?
 
Max79:
Как протестировать советник без учета спрэда? Такое возможно?
Гуглите и обрящете, ну например здесь (задать спред ? site:mql4.com) почитайте: https://www.mql5.com/ru/forum/102224/page2
 

у кого есть такой индюк?

 

Помогите пожалуйста.

Я поставил модификатор отложенных ордеров, в советник, а он мне при тестировании в Журнал выдаёт ошибку - 1.

Т.е. - "Если в качестве параметров функции передать неизменные значения, то в этом случае будет сгенерирована ошибка 1 (ERR_NO_RSULT)."

Я перед модификацийе поставил проверку, но не помогает. В чём ошибка? Советник тестируется, но как отсеять ордера с неизменными значениями?

 
Run:

у кого есть такой индюк?

Вот глянь:

http://www.kimiv.ru/index.php?option=com_remository&Itemid=13&func=fileinfo&id=45