Примеры: 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

{

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

}