Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 828

 
Приветствую. Вопрос, в большей степени, логический.
Так называемая система антимартингейл, с ограничением количества увеличений. При закрытии в профит, следующий лот увеличивается на коэффициент. При убытке или если количество прибыльных позиций, идущих подряд, превысит указанное число, лот равен стартовому.
После превышения указанного количества прибыльных позиций, как начать цикл увеличения заново?
int K_U_=5;
double  LotExponent=2.00;
//+------------------------------------------------------------------+
double llot()
  {
   double lt1=LotLastCloPos(Symbol(),m_magic);//лот последней закрытой позиции
   if(CountProfit(Symbol(),m_magic)>=1 && CountProfit(Symbol(),m_magic)<K_U_)
      LotSize=lt1*LotExponent;//
   else
      LotSize=Lots;
   return(LotSize);
  }


/

 
lil_lil:
Приветствую. Вопрос, в большей степени, логический.
Так называемая система антимартингейл, с ограничением количества увеличений. При закрытии в профит, следующий лот увеличивается на коэффициент. При убытке или если количество прибыльных позиций, идущих подряд, превысит указанное число, лот равен стартовому.
После превышения указанного количества прибыльных позиций, как начать цикл увеличения заново?


/

Пример в коде Stop Loss Take Profit: размер лота хранится (перезаписывается, увеличивается и сбрасывается в минимум) в переменной "ExtLot" объявленной на глобальном программном уровне (в шапке). В OnTradeTransaction() отлавливается сделки с типом "выход из рынка" и проверяется как была закрыта сделка - по Тейк Профит или по Стоп Лосс:

         if(deal_entry==DEAL_ENTRY_OUT)
           {
            if(deal_reason==DEAL_REASON_SL)
               ExtLot*=2.0;
            else if(deal_reason==DEAL_REASON_TP)
               ExtLot=m_symbol.LotsMin();
           }

Если по Стоп Лосс то удваиваем лот, если по Тейк Профит - то сбрасываем размер лота в минимальное значение.


Примечание: в самом советнике немного некорректно выполняется расчёт Стоп Лосс и Тейк Профит - но скоро переопубликуется код.

 
Vladimir Karputov:

Пример в коде Stop Loss Take Profit: размер лота хранится (перезаписывается, увеличивается и сбрасывается в минимум) в переменной "ExtLot" объявленной на глобальном программном уровне (в шапке). В OnTradeTransaction() отлавливается сделки с типом "выход из рынка" и проверяется как была закрыта сделка - по Тейк Профит или по Стоп Лосс:

Если по Стоп Лосс то удваиваем лот, если по Тейк Профит - то сбрасываем размер лота в минимальное значение.


Примечание: в самом советнике немного некорректно выполняется расчёт Стоп Лосс и Тейк Профит - но скоро переопубликуется код.

Подсчитываю количество прибыльных сделок идущих подряд, если оно превышает 5, то возвращаюсь к начальному лоту, позиция 6 открывается начальным лотом а позиция 7 должна открыться объёмом = лот позиции 6 умножить на коэффициент и т. д. Цикл увеличения лота нужно начать заново.Когда прибыльных ещё 5 позиций, нужно снова вернуться к начальному лоту. 

Профитных позиций 20, подряд. Их лоты должны быть такими 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16


 
lil_lil:

Подсчитываю количество прибыльных сделок идущих подряд, если оно превышает 5, то возвращаюсь к начальному лоту, позиция 6 открывается начальным лотом а позиция 7 должна открыться объёмом = лот позиции 6 умножить на коэффициент и т. д. Цикл увеличения лота нужно начать заново.Когда прибыльных ещё 5 позиций, нужно снова вернуться к начальному лоту. 

Профитных позиций 20, подряд. Их лоты должны быть такими 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16


Нужно в функции подсчёта лота использовать статическую переменную. Вот как это работает:

//+------------------------------------------------------------------+
//|                                                       Test_1.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(void)
  {
   static int counter=0;
   for(int i=0;i<18;i++)
     {
      Print(counter);
      counter++;
      if(counter==5)
         counter=0;
     }
  }
//+------------------------------------------------------------------+

Результат:

0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
Файлы:
Test_1.mq5  2 kb
 
Vladimir Karputov:

Нужно в функции подсчёта лота использовать статическую переменную. Вот как это работает:

Результат:

Обнуляю по вашему примеру, но не получается порядок увеличения лота

Профитных позиций 20, подряд. Их лоты должны быть такими 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16 а получается так 1, 2, 4, 8,16, 1, 1, 1, 1, 1,............

Что неправильно?

int K_U_=5;  double   Lots=1.0;
double  LotExponent=2.00;
//+------------------------------------------------------------------+
double llot()
  {
   double lt1=LotLastCloPos(Symbol(),m_magic);
   if(CountProfit(Symbol(),m_magic)>=1 && CountProfit(Symbol(),m_magic)<K_U_)
      LotSize=lt1*LotExponent;//
   else
      LotSize=Lots;
   return(LotSize);
  }
  
//+------------------------------------------------------------------

int CountProfit(const string Symb,const long MagicNumber=0)
  {
    int counter=0;
   ulong Ticket;

   if(HistorySelect(0,LONG_MAX))
      for(int i=HistoryDealsTotal()-1; i>=0; i--){
      
         if((bool)(Ticket=HistoryDealGetTicket(i)) && 
            (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT) &&
            (HistoryDealGetInteger(Ticket, DEAL_MAGIC) == MagicNumber) &&
            (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symb))
           {
            if(HistoryDealGetDouble(Ticket,DEAL_PROFIT)>0)
            counter++; else
               break;
           }
           }
   if(counter==K_U_)
      counter=0;
   return(counter);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double LotLastCloPos(const string Symb,const long MagicNumber=0)
  {
   ulong Ticket;
   double lot_=0;

   if(HistorySelect(0,LONG_MAX))
      for(int i=0; i<HistoryDealsTotal(); i++)
         if((bool)(Ticket=HistoryDealGetTicket(i)) && 
            (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT) &&
            (HistoryDealGetInteger(Ticket, DEAL_MAGIC) == MagicNumber) &&
            (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symb))
           {

            lot_=HistoryOrderGetDouble(Ticket,ORDER_VOLUME_INITIAL);

           }

   return(lot_);
  }
 
lil_lil:

Обнуляю по вашему примеру, но не получается порядок увеличения лота

Профитных позиций 20, подряд. Их лоты должны быть такими 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16 а получается так 1, 2, 4, 8,16, 1, 1, 1, 1, 1,............

Что неправильно?

Значит всё таки не хотите нормально работать через OnTradeTransaction? Значит предпочитаете запрашивать АБСОЛЮТНО ВСЮ ТОРГОВУЮ историю (начиная с 1970 года)? Зачем???

 
Vladimir Karputov:

Значит всё таки не хотите нормально работать через OnTradeTransaction? Значит предпочитаете запрашивать АБСОЛЮТНО ВСЮ ТОРГОВУЮ историю (начиная с 1970 года)? Зачем???

Нашлась причина, скобки.

Что значит не хочу, какое отношение имеет OnTradeTransaction к моему вопросу;)

 

Теперь, понятно, двумя постами раньше моего вопроса пример подсчёта.

Спасибо.

 
lil_lil:

Нашлась причина, скобки.

Что значит не хочу, какое отношение имеет OnTradeTransaction к моему вопросу;)

Просто запрос торговой истории

HistorySelect(0,LONG_MAX)

означает запросить всю, всю, всю историю с этого торгового счёта начиная с 1970 года. Это очень не оптимально:

  • а если на этом счёте тысячи сделок?
  • а если (не дай бог) Вы этот запрос делаете на каждом тике?

 

Прошу поделится функциями, работающими с торговой историей.

Мне нужно получать информацию о дате открытия последней сделки, закрытия, объеме, финансовом результате и её типе  (покупка или продажа).

Если есть у кого похожие готовые функции, то прошу Вас поделится.