[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 665

 
Roger:
Считайте хаи и лоу не с нулевого бара, а с первого, на нулевом баре не может быть Бид меньше Мин.
То есть i=1; ? А Bid и Ask не трогать?
 
eugggy:
double
Min=Bid, объявление переменных

Max=Bid,

____________________________________________________________________________________________

for (i=0;i<=20-1;i++) критерии открытия

{
if (Low[i]<Min) Min=Low[i]:
if (High[i]>Max) Max=High[i];

}

if (................. &&Ask>Max)

{

Opn_B=true; // открытие Buy

}

if (................ &&Bid<Min)

{

Opn_S=true; // открытие Sell

}

___________________________________________________________________________________________

Сожалею, что в таком неприглядном виде - пришлось по памяти писать т.к код не работал и я его удалил. Но Вам, как профессионалу, должно быть понятно(я надеюсь).

____________________________________________________________________________________________

Вы мне льстите :)) Я такой же начинающий, как и вы...

extremumprice.mq4 
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
extern int  Quant_Bars  =30;                    // Количество баров
bool        OpnBuy      =false,
            OpnSell     =false;
//--------------------------------------------------------------------
int start()                                     // Спец. функция start
  {
   int i;                                       // Номер бара 
   double Minimum=Bid,                          // Минимальная цена
          Maximum=Bid;                          // Максимальная цена
 
   for(i=0;i<=Quant_Bars-1;i++)                 // От нуля (!) до..
     {                                          // ..Quant_Bars-1 (!)
      if (Low[i]< Minimum)                      // Если < известного
         Minimum=Low[i];                        // то оно и будет мин
      if (High[i]> Maximum)                     // Если > известного
         Maximum=High[i];                       // то оно и будет макс
     }
//--------------------------------------------------------------------

   if (iOpen(NULL,0,1)>Maximum)
      {
         OpnBuy =true:
         OpnSell=false;
      }
   if (iOpen(NULL,0,1)<Minimum)
      {
         OpnSell=true;
         OpnBuy =false:
      }   
//-------------------------------------------------------------------
//  А тут код открытия позиций.  if (OpnBuy)  {открываем Бай};
//                               if (OpnSell) {открываем Селл};
// Но обязательно нужно сделать проверку на существование уже открытой позиции,
// иначе они будут открываться на каждом тике пока присутствует сигнал...
   return;                                      // Выход из start()
  }
//--------------------------------------------------------------------
Где-то так. Не проверял, так, от балды, на коленке написал...
 
artmedia70:

Ну так вот логика:

1. устанавливаете отложенный ордер с магиком, допустим 101 и сбрасываем флаг преобразования ордера в позицию, ну допустим ConvOrd=false;

2. проверяем появилась ли позиция с магиком 101, если да, устанавливаем флаг преобразования ConvOrd=true;

3. проверяем ConvOrd на истинность и если ConvOrd==true,
проверяем существование позиции с магиком 101 и если её нет -
значит она уже закрыта

{сбрасываем флаг ConvOrd=false; устанавливаем новый отложенный;}

Думаю, можно и без флагов обойтись...


Логика мне понятна, а вот как реализовать её в коде не знаю. Я перепробовал много вариантов но результата так и не добился. Думаю, что "чайник". Поэтому я и написал сюда. На стр.663 я показал свой код. Если есть желание - доделайте его или хотя бы конкретнее расскажите как мне его доделать. Спасибо.
 
artmedia70, Roger спасибо за помощь. Кажется разобрался, действительно цена на 0-ом баре не может быть ниже и выше минимума и максимума, это я не подумал, и добавил Ask, как значение переменной Min, теперь вроде работает. artmedia70, по сравнению со мной, большинство профессионалы))). Ещё раз спасибо.
 
dimon74:
Логика мне понятна, а вот как реализовать её в коде не знаю. Я перепробовал много вариантов но результата так и не добился. Думаю, что "чайник". Поэтому я и написал сюда. На стр.663 я показал свой код. Если есть желание - доделайте его или хотя бы конкретнее расскажите как мне его доделать. Спасибо.

Попробуйте проще, когда выставляете СеллСтоп ордер, запомните значение Тейкпрофита и, если Бид опустится ниже этой цены, выставляйте на Бай.
 
Roger:

Попробуйте проще, когда выставляете СеллСтоп ордер, запомните значение Тейкпрофита и, если Бид опустится ниже этой цены, выставляйте на Бай.
Спасибо за совет! Я этот вариант уже пробовал но для реализации моей стратегии он не подходит.
 
dimon74:
Спасибо за совет! Я этот вариант уже пробовал но для реализации моей стратегии он не подходит.
Да простят меня профи, но я таки дам вам список полезных функций от Игоря Кима, глядишь и сами сконструируете... :)
Файлы:
 

Чёт-то не пойму никак, почему выставляются сразу две локирующие позиции. Логика такова:

При достижении эквити определённого кол-ва процентов прибыли от её прошлого значения, закрываем все позиции... Это работает как надо... Далее...

При снижении эквити на определённое кол-во процентов от её прошлого значения ищем позицию с самым большим убытком, определяем кто она... ну там Бай или Селл

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

ну допустим 10 пунктов, закрываем их нафиг...

По логике вещей на следующем тике должна сначала провериться эквити и, если там стало всё ОК, то далее продолжаем работать-с... Ежели опять всё бяка, значит ищем следующего сохатого...

Но вот чё-то он открывает у меня сразу два локирующих ... и Бай и Селл, причём, если лот был 0.1, то первый локирующий открывается удвоенным лотом = 0.2,

а второй опять его удваивает и уже открывается лотом 0.4 ... Соответственно, какой тут нафиг лок, если они друг с дружкой теперь воюют за место под Солнцем ... :(

Код прилагаю, мож кто ткнёт меня мо... пальцем.

//----------------- Закрытие позиций если эквити выросло на N процентов ---------------------------
            
   if (Equ_NEW>=Equ_OLD+EquPerc)                       // Новое эквити больше старого на процент прибыли..
   {                                         
//      ClosePosBySizeLossInCurrency(NULL, -1, -1, 0); // Закрытие всех убыточных позиций
      ClosePosFirstProfit(NULL, -1, -1);           // Закрываем все позиции, сначала прибыльные
      DeleteOrders(NULL, -1, -1);                  // Удаляем ордера
      Equ_NEW=AccountEquity();                     // Запоминаем новое значение эквити
      Equ_OLD=Equ_NEW;                             // и вписываем его в "старое"
      CountClsEQU++;                               // Увеличиваем счётчик кол-ва закрытий для ф-ции вывода информации
      LockBuy51 =true;                             // Разрешаем открытие локирующих
      LockSell51=true;                             // позиций Buy и Sell
      OpnBuy51  =true;                             // и вообще разрешаем открываться
      OpnSell51 =true;                             // в любую сторону... 
   }

//------------- Включение вывода убыточных позиций в ноль, если эквити упало на N процентов -----------------------
               
   if (Equ_NEW<=Equ_OLD-EquPerc/2)                 // Новое эквити меньше старого на столько-то процентов...
      {                                         
         Trade=false;                              // Запрещаем торговлю
//-------------- Закрытие двух позиций, если ранее был установлен лок на убыточную ------------- 
        
         if (OrderSelect(TicketLoss, SELECT_BY_POS, MODE_TRADES))    // Выбираем убыточную позицию (если её тикет
            {                                                        // ранее был сохранён в TicketLoss)
               double prloss=OrderProfit()+OrderSwap();              // Размер профита убыточной позиции
               int typeloss =OrderType();                            // Тип убыточной позиции
               int mnloss   =OrderMagicNumber();                     // Magic убыточной позиции
            }
         if (OrderSelect(TicketLock, SELECT_BY_POS, MODE_TRADES))    // Выбираем локирующую позицию (если её тикет
            {                                                        // ранее был сохранён в TicketLock)
               double prlock=OrderProfit()+OrderSwap();              // Размер профита локирующей позиции
               int typelock =OrderType();                            // Тип локирующей позиции
            }
         if (prloss+prlock>=10*Point)                                // Если их суммарный профит больше 10 пунктов
            {
               ClosePositions(NULL, typelock, 5100);           // Закрываем локирующую позицию
               ClosePositions(NULL, typeloss, mnloss);         // Закрываем убыточную позицию
            }
//--------------- Поиск убыточной позиции и установка локирующей -------------------------  
       
         double Loss=0;                                        // Последнее значение убытка
         int    i, k=OrdersTotal(), OrdTicket=-1;

         for (i=k-1; i>=0; i--) {                              // Цикл по всем ордерам терминала
            if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
               if ((OrderProfit()+OrderSwap()<0)) {            // Если профит позиции меньше 0
                  if (Loss>OrderProfit()+OrderSwap()) {        // Если последнее значение убытка больше убытка позиции  
                     Loss=OrderProfit()+OrderSwap();           // Значит тут убыток больше, запоминаем как последнее
                     OrdTicket=i;                              // Запоминаем номер убыточной позиции
                  }
               }
            }
         }
            if (OrdTicket>=0) {
               if (OrderSelect(OrdTicket, SELECT_BY_POS, MODE_TRADES)) {   // Выбираем позицию по тикету
                  TicketLoss=OrdTicket;                                    // Запоминаем как тикет убыточной позы
                  if (OrderType()==OP_BUY)                                 // Если её тип Бай
                     {
                        Magic=5100;                                              // Задаём магик... 
                        New_Comm="Sell_M5_Стратегия_1_Локирующая позиция";       // Задаём комментарий для позиции
                        Lots_New=NormalizeLot(OrderLots()*2, False, NULL);       // Увеличим лот в два раза
                        if (!ExistPositions(NULL, OP_SELL, 5100, 0)){            // Если нет локирующего Sell
                        OpenPosition(NULL,OP_SELL,Lots_New,0,pb-tp*100*po,Magic,New_Comm);} // Открываем локирующий...
                        if (ExistPositions(NULL, OP_SELL, 5100, 0))              // Проверяем, заодно и выбираем её
                              {TicketLock=OrderTicket();}                        // Сохраняем тикет локирующего Sell
                     }
                  if (OrderType()==OP_SELL)
                     {
                        Magic=5100;                                              // Задаём магик... 
                        New_Comm="Buy_M5_Стратегия_1_Локирующая позиция";        // Задаём комментарий для позиции
                        Lots_New=NormalizeLot(OrderLots()*2, False, NULL);       // Увеличим лот в два раза
                        if (!ExistPositions(NULL, OP_BUY, 5100, 0)){             // Если нет локирующего Buy
                        OpenPosition(NULL,OP_BUY,Lots_New,0,pa+tp*100*po,Magic,New_Comm);} // Открываем локирующий...
                        if (ExistPositions(NULL, OP_BUY, 5100, 0))               // Проверяем, заодно и выбираем её
                              {TicketLock=OrderTicket();}                        // Сохраняем тикет локирующего Buy
                     }
               }
            }
         }

Начиная с

//------------- Включение вывода убыточных позиций в ноль, если эквити упало на N процентов -----------------------

где-то косяк живёт...

 

СТРАНИЦА НОМЕР "666" :-)

 
Страшная... У-у-у!!!
Причина обращения: