Примеры: MetaEditor: Опираясь на силу шаблонов - страница 5

 
gince:
Правильно ли я понял?
Нет, неправильно. В этой функции мы должны решить в цикле - закрывать каждую позицию или нет. Например, текущий обрабатываемый ордер имеет тип OP_BUY, а выражение
(Red_1 < Yellow_1 && Red_2 > Yellow_2)

говорит, что нужно закрывать покупки. Тогда мы заносим тикет этого ордера в массив

ticketsClose[][2]

далеее этот массив попадет в функцию

void CloseMarketOrders(int ticketsArray[][2], double lotsArray[])

и все находящиеся в нем тикеты будут закрыты.

 
Тогда думаю что так
//+------------------------------------------------------------------+
//|  подготовить массив тикетов для закрытия                         |
//+------------------------------------------------------------------+
void PrepareTicketsToClose(int signal, bool Revers, int & ticketsClose[][2], 
				   double & lots[],double arrayTickets[][9])
   {
   int size=ArrayRange(arrayTickets,0);
//----
   if (size==0) return;
 
   int i,type,ticket,closeSize;
   for (i=0;i<size;i++)
      {
      type=arrayTickets[i][1];
      // если тип ордера не рыночный, то пропуcкаем
      if (type>OP_SELL) continue;
 
      if (Revers) // перевернем тип рыночного ордера
         {
         if (type==OP_BUY) type=OP_SELL; else type=OP_BUY;
         }
      
      // тут решаем для каждого открытого ордера его судьбу
      //  оставить в рынке или добавить в массив на закрытие
       
if (type==OP_BUY)
         {
         //  
         // код разрешающий оставить покупку
         Здесь решаем - оставить ордер BUY или закрыть
         
         // как пример
         if(Red_1 < Yellow_1 && Red_2 > Yellow_2)  continue;
         }
         
      
 if (type==OP_SELL)
         {
         //  
         // код разрешающий оставить продажу
         Здесь решаем - оставить ордер SELL или закрыть
         
         // как пример
          if(Red_1 > Yellow_1 && Red_2 < Yellow_2)  continue;
         }
 
      closeSize=ArrayRange(ticketsClose,0);
      ArrayResize(ticketsClose,closeSize+1);
      ArrayResize(lots,closeSize+1);
      ticketsClose[closeSize][0] = arrayTickets[i][0]; // # тикета
      ticketsClose[closeSize][1] = arrayTickets[i][1]; // тип ордера
      Print("arrayTickets[i][0]=",arrayTickets[i][0],"   ticketsClose[closeSize][0]=",ticketsClose[closeSize][0]);
      
      // здесь укажем сколько лотов нужно закрыть
      lots[closeSize] = arrayTickets[i][2]; // закрываемый объем
      // можно закрывать частично, тогда нужно переписать строку сверху
      }
//----
   return;   
   }
 
gince:
Тогда думаю что так

Очень похоже на правду (то, я не знаю, правильно ли будет работать выражение

        (Red_1 < Yellow_1 && Red_2 > Yellow_2)

, но внешне выглядит правильно).

 

Спасибо

Со стратегией есть проблемы  В шаблоне неоткрывает ни одной позиции а те же условия вsтавлены в Moving Average Simple.mq4 если попадают первое открытие ордера на Бай то и все следующие на БАй и Сел небывает ну а если первый открытый ордер Сел то он незакрывается

Но наверное так и надо учится на ошибках

Еще раз спасибо вам

Если быдут вопросы по шаблону буду спрашивать  Наверное неоткажите начинающему програмисту

 

 

Спасибо за статью. Очень полезная для меня доморощенного программиста любителя. Удобная для теста разных стратегий. Мне очень помогла. При более детальном разборе - выявил недописки в прилагаемом шаблоне.

Две в одной ф-ии void CalculateSL_and_TP, вот эти места:

-----

oldOpenPrice = openPrice;

oldSL = SL;
oldTP = TP;

oldType=type;

------

if (newSL>0 || newTP>0 || newOpen>0)
{
sizeSL_TP=ArrayRange(arraySL_TP,0);

ArrayResize(arraySL_TP,sizeSL_TP+1);

-------

И в функции ожидания нового бара периоды Н4 и Д имеют одно значение.

Вроде так. По крайней мере без тех двух добавок - модифицировать ордера не желает...

 
Vik10:

Спасибо за статью. Очень полезная для меня доморощенного программиста любителя. Удобная для теста разных стратегий. Мне очень помогла. При более детальном разборе - выявил недописки в прилагаемом шаблоне.


-------

И в функции ожидания нового бара периоды Н4 и Д имеют одно значение.

Вроде так. По крайней мере без тех двух добавок - модифицировать ордера не желает...

Спасибо, залил шаблон с Вашими поправками.
 

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

Я так понимаю, в yourFunction прежде чем вернуть результат покупать, продавать или ничего не делать (res = OP_BALANCE) нужно проверить открыты-ли уже ордера. Но как это сделать, что-то я не соображу. Подскажите как именно проверить уже наличие открытой позиции?

 

NIN писал(а):

Я так понимаю, в yourFunction прежде чем вернуть результат покупать, продавать или ничего не делать (res = OP_BALANCE) нужно проверить открыты-ли уже ордера. Но как это сделать, что-то я не соображу. Подскажите как именно проверить уже наличие открытой позиции?

На самом деле факт наличия открытых позиций никак не должен влиять на оценку текущей ситуации - покупать, продавать, или оставаться в рынке. Это уже потом после получения сигнала на покупку или продажу необходимо думать как этот сигнал интерпретировать.
 
Rosh:
На самом деле факт наличия открытых позиций никак не должен влиять на оценку текущей ситуации - покупать, продавать, или оставаться в рынке. Это уже потом после получения сигнала на покупку или продажу необходимо думать как этот сигнал интерпретировать.

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

Но как проверить наличие открытой позиции?

 
NIN:
Но как проверить наличие открытой позиции?

Хотя бы так:

total = OrdersTotal();

 //---------------------------------------- Проверка сигналов  ------------------------------------------

if(total >= MaxTrades)

   {

   return;

   }

else

{

Собственно проверка торговых сигналов и установка ордеров

}

Причина обращения: