Стохастик. 1. отступы для новых сделок при наличии открытых старых 2. закрытие по второму сигналу

 

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

основные условия открытия позиции на примере открытия на покупку (для продаж зеркально):

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

пример для открытия на бай:

  • есть последняя открытая позиция на бай по цене 1,2550
  • новую позицию на покупку можно открыть выше 1,2580

пример для открытия на селл:

  • есть последняя открытая позиция на селл по цене 1,2550
  • новую позицию на селл можно открыть  ниже 1,2520

условия закрытия позиции (на покупку), должны выполнится оба пункта

  1. медленная линия стохастика пересекает уровень 80 стохастика сверху вниз
  2. нужно добавить условие  - это второе пересечение (см. пункт выше) для каждой ранее открытой позиции.

сорри если не точно пояснил по закрытию, на графике закрытие выглядит так: красными крестикам отмечены два сигнала на закрытие сделки, т.к. медленная (красного цвета) линия стохастика пересекает уровень 80 сверху вниз. Но сделка закрывается только на втором сигнале/пересечении


код. выполняются только пункты 1 по открытию и закрытию

void OnTick()
  {

//--- Достаточно ли количество баров для работы
   if(Bars(_Symbol,_Period)<10) // общее количество баров на графике меньше 10?
     {
      Alert("На графике меньше 10 баров, советник не будет работать!!");
      return;
     }
//--- сначала нужно записать в массивы значения буферов индиктора Fractal
//--- заполнение данными буфера

   ArraySetAsSeries(Signal,true);
   ArraySetAsSeries(Main,true);

   
   if(CopyBuffer(Stochastic_handle,0,0,100,Main)<=0) return;
   if(CopyBuffer(Stochastic_handle,1,0,100,Signal)<=0) return;

   double Main_1=Main[1];
   Main_1=NormalizeDouble(Main_1,5);
    
   double Main_2=Main[2];
   Main_2=NormalizeDouble(Main_2,5);
   
   
   double Signal_1=Signal[1];
   Signal_1=NormalizeDouble(Signal_1,5);
   Print("Signal_1=",DoubleToString(Signal_1,5));
   
   double Signal_2=Signal[2];
   Signal_2=NormalizeDouble(Signal_2,5);

   
// Для сохранения значения времени бара мы используем static-переменную Old_Time.
// При каждом выполнении функции OnTick мы будем сравнивать время текущего бара с сохраненным временем.
// Если они не равны, это означает, что начал строится новый бар.

   static datetime Old_Time;
   datetime New_Time[1];
   bool IsNewBar=false;

// копируем время текущего бара в элемент New_Time[0]
   int copied=CopyTime(_Symbol,_Period,0,1,New_Time);
   if(copied>0) // ok, успешно скопировано
     {
      if(Old_Time!=New_Time[0]) // если старое время не равно
        {
         IsNewBar=true;   // новый бар
         if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("Новый бар",New_Time[0],"старый бар",Old_Time);
         Old_Time=New_Time[0];   // сохраняем время бара
        }
     }
   else
     {
      Alert("Ошибка копирования времени, номер ошибки =",GetLastError());
      ResetLastError();
      return;
     }
     
     
  //открытие покупок

     if(Main_1>Signal_1&&Main_2<Signal_2)
     {
      if(IsNewBar!=false)
        {
           
              {
               open_by_market();

              }
        }
     }
  

  // закрытие покупок 
 
   if (Signal_2>80&&Signal_1<80)
   {
   if(PositionsTotal()>0)
        {
         for(int i=0;i<PositionsTotal();i++)
           {
            ulong orders_ticket=PositionGetTicket(i);
            if(((PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) ))
              
              
              {  trade.PositionClose(orders_ticket); }        
            
         }
     }           
   }
 
}
   
Совершение сделок - Торговые операции - MetaTrader 5
Совершение сделок - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
  1. нужно добавить условие -  если есть открытая позиция  на покупку, при новом сигнале (см.пункт выше) сделка открывается только в том случае когда цена открытия новой сделки выше цены открытия последней открытой позиции на заданное кол-во пунктов, например 30.

Значит нужна функция, которая обходит список всех позиций и запоминает самую ... цену. Здесь нужно уточнение: если имеем позицию BUY, то следующая может быть открыта если отступ от её цены ВВЕРХ N-пунктов (пипсов) или ВНИЗ N-пунктов (пипсов)?

Аналогичный вопрос для SELL позиции.
 

в две стороны отступ ( поправил в шапке темы)

"если имеем позицию BUY, то следующая может быть открыта если отступ от её цены ВВЕРХ N-пунктов (пипсов) или ВНИЗ N-пунктов (пипсов)?" - да

 
gastinets:

в две стороны отступ ( поправил в шапке темы)

"если имеем позицию BUY, то следующая может быть открыта если отступ от её цены ВВЕРХ N-пунктов (пипсов) или ВНИЗ N-пунктов (пипсов)?" - да

Не понятно. Нужно прописать для BUY и для SELL. Не может быть такого в природе, чтобы одновременно было и ВЫШЕ и НИЖЕ :) .

 
если открыта позиция на покупку , новая позиция может может быть открыта если  цена открытия выше цены открытия последней открытой позиции на покупку на заданное кол-во пунктов, например 30

пример:

  • есть последняя открытая позиция на бай по цене 1,2550
  • новую позицию на покупку можно открыть выше 1,2580

если открыта позиция на продажу , новая позиция может может быть открыта если  цена открытия  ниже цены открытия последней открытой позиции на продажу на заданное кол-во пунктов, например 30

пример:

  • есть последняя открытая позиция на селл по цене 1,2550
  • новую позицию на селл можно открыть  ниже 1,2520
Совершение сделок - Торговые операции - MetaTrader 5
Совершение сделок - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 

Открыто две позиции BUY. Работает по варианту 2:


Так как всё-таки работать: с последней BUY позицией или всё-таки с позицией BUY у которой самая высокая цена открытия?

 

сорри, понял ошибки в логике - исправил в посте выше и в шапке

логика как в посте №4 ( относительно последней сравниваем , при покупках если есть открытые на бай  новая только выше , при продажах наоборот)

 
gastinets:

сорри, понял ошибки в логике - исправил в посте выше и в шапке

логика как в посте №4 ( относительно последней сравниваем , при покупках если есть открытые на бай  новая только выше , при продажах наоборот)

В "шапке" (пост №1) не исправили. Люди будут смотреть в первую очередь первый пост, а не четвёртый. Поэтому первый пост должен быть красавцем во всех отношениях .

 
поправил)
 

Есть у меня одна функция - она возвращает количество позиций BUY ("count_buys"), цену самой НИЗКОЙ позиции BUY ("price_lowest_buy"), количество позиций SELL ("count_sells"), цену самой ВЫСОКОЙ позиции SELL ("price_highest_sell")

//+------------------------------------------------------------------+
//| Calculate all positions                                          |
//+------------------------------------------------------------------+
void CalculateAllPositions(int &count_buys,double &price_lowest_buy,
                           int &count_sells,double &price_highest_sell)
  {
   count_buys  =0;   price_lowest_buy  =DBL_MAX;
   count_sells =0;   price_highest_sell=DBL_MIN;
   for(int i=PositionsTotal()-1;i>=0;i--)
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
               count_buys++;
               if(m_position.PriceOpen()<price_lowest_buy) // the lowest position of "BUY" is found
                  price_lowest_buy=m_position.PriceOpen();
               continue;
              }
            else if(m_position.PositionType()==POSITION_TYPE_SELL)
              {
               count_sells++;
               if(m_position.PriceOpen()>price_highest_sell) // the highest position of "SELL" is found
                  price_highest_sell=m_position.PriceOpen();
               continue;
              }
           }
  }

Нужно чуть переделать, чтобы она искала цену самой ВЫСОКОЙ позиции BUY и цену самой НИЗКОЙ позиции SELL...

 
спасибо, изучаю...
Причина обращения: