[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 207

 
solnce600:

Господа!Подскажите пожалуйста как закодировать(вероятно  в условном операторе) простую идею

-если сделка закрылась по стоп-лоссу

-по цене стоп-лосса открыть другую сделку

Спасибо

Поковыряйтесь.
 
Roger:

1. Нельзя открывать ордера в функции init().(В тестере еще прокатит, но уже на демо работать не будет)

2. Когда закрываете ордера, считать надо с конца к началу, а не наоборот, как у Вас. 

 

Спасибо за ответ.
В этом случае исследовалась работа оператора цикла именно в тестере, поэтому ордера открыты в init() для упрощения, в реальных экспертах такого не бывает.
Изменение порядка выбора ордеров действительно приводит к их закрытию в течении одного тика (код программы и отчёт из журнала тестера привожу ниже).
Мне кажется странным, что в MQL4 нельзя выбирать порядок работы с ордерами, если вы знаете почему подскажите, пожалуйста, т.к. по логике работы эксперта я собираюсь закрывать ордера именно в порядке их открытия.

С уважением. Shurkin.

Код программы.

//+------------------------------------------------------------------+
//|                                                     Poligon1.mq4 |
//|                                            21 февраля 2013 года. |
//|Тестирование оператора цикла for.                                 |
//+------------------------------------------------------------------+
#property copyright "21 февраля 2013 года."
#property link      ""
//+------------------------------------------------------------------+
//|Объявленные переменные                                            |
//+------------------------------------------------------------------+
int Mn=357;//Magic number
int i;//Показатель счётчика итераций
double PriTP;//TP серии
int Tick;//Счётчик тиков
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----Установка серии ордеров
OrderSend(Symbol(),OP_BUY,0.5,Ask,0,NormalizeDouble(Bid-35*Point,Digits),
NormalizeDouble(Ask+35*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,1,Ask,0,NormalizeDouble(Bid-25*Point,Digits),
NormalizeDouble(Ask+25*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,1.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,2.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,3.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUYLIMIT,1,NormalizeDouble(Ask-15*Point,Digits),0,
NormalizeDouble(Bid-40*Point,Digits),NormalizeDouble(Ask+25*Point,Digits),
NULL,Mn,0,CLR_NONE);//OP_BUYLIMIT
OrderSend(Symbol(),OP_SELLSTOP,3,NormalizeDouble(Ask-30*Point,Digits),0,
NormalizeDouble(Bid+15*Point,Digits),NormalizeDouble(Ask-75*Point,Digits),
NULL,Mn,0,CLR_NONE);//OP_SELLSTOP
//----
   PriTP=Bid;//PriTP
   Print("Кс0:"," OrdersTotal=",OrdersTotal());//Сообщение
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   Tick++;//Tick
//   Print("Кс1:"," Tick=",Tick);//Сообщение
//----
//   for(i=0;i<OrdersTotal();i++)//Инициализация цикла
   for(i=OrdersTotal()-1; i>=0; i--)//
   {
   Print("Кс2:"," Tick=",Tick," i=",i);//Сообщение
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)//Выбор ордера i
    {
   if(OrderSymbol()==Symbol())//Символ
     {
   if(OrderMagicNumber()==Mn)//Идентификационное число
      {
   if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//Тип операции текущего выбранного ордера
       {
   OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);//Закрытие позиции
       }//Закрыто if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
      }//Закрыто if(OrderMagicNumber()==Mn)
     }//Закрыто if(OrderSymbol()==Symbol()
    }//Закрыто if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
   }//Закрыто for(i=0;i<OrdersTotal();i++)
//----
   return(0);
  }
//+------------------------------------------------------------------+
Записи в журнале тестера.

2013.03.08 13:28:19     Poligon1 EURUSD,M15: removed
2013.03.08 10:14:14     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=3 i=0
2013.03.08 10:14:14     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=3 i=1
2013.03.08 10:13:50     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=2 i=0
2013.03.08 10:13:50     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=2 i=1
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #1 buy 0.50 EURUSD at 1.3397 sl: 1.3360 tp: 1.3432 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=0
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #2 buy 1.00 EURUSD at 1.3397 sl: 1.3370 tp: 1.3422 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=1
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #3 buy 1.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=2
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #4 buy 2.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=3
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #5 buy 3.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=4
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=5
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=6
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс0: OrdersTotal=7
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #7 sell stop 3.00 EURUSD at 1.3367 sl: 1.3410 tp: 1.3322 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #6 buy limit 1.00 EURUSD at 1.3382 sl: 1.3355 tp: 1.3422 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #5 buy 3.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #4 buy 2.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #3 buy 1.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #2 buy 1.00 EURUSD at 1.3397 sl: 1.3370 tp: 1.3422 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #1 buy 0.50 EURUSD at 1.3397 sl: 1.3360 tp: 1.3432 ok
2013.03.08 10:13:26     Poligon1 test started
2013.03.08 10:13:24     Poligon1 EURUSD,M15: loaded successfully

 

 
Большое спасибо за ценную информацию.Обязательно постараюсь учесть в дальнейшем все что вы мне сказали.
 
borilunad:

Именно по цене стоп-лосса не сможете открыть, но поставить условие открыть в том же или обратном направлении можно!

Вот Вам вызов функции из "Полезных функций" от Кима, который можете поставить в условие:

isCloseLastPosByStop - Возвращает флаг закрытия последней позиции по стопу

if(isCloseLastPosByStop() == 0) или ... == 1) и что хотите .....

Функцию найдёте здесь: https://www.mql5.com/ru/forum/131859

И поставьте её за пределами старта!

И убедительная просьба! Всё это можете делать Вы сами, приложив старание, аккуратность и терпение, иначе на подсказках ничему не научитесь!

Знания приобретаются только с адекватными с Вашей стороны усилиями! Входите в ежедневную пытливую работу! Удачи!


 

Большое спасибо за ценную информацию.Обязательно постараюсь учесть в дальнейшем все что вы мне сказали.
 

Доброго времени суток.

Подскажите пожалуста, бывают ли ситуации, когда ДЦ могут изменить или удалить коментарии к  ордеру?

Заранее спасибо. 

 
Gek34:

Подскажите пожалуста, бывают ли ситуации, когда ДЦ могут изменить или удалить коментарии к  ордеру?...

На примере.
Родной комментарий
e121220_3in1 01

С допиской ДЦ после ролловера

e121220_3in1 01[swap]

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

 

Shurkin:

Спасибо за ответ.
В этом случае исследовалась работа оператора цикла именно в тестере, поэтому ордера открыты в init() для упрощения, в реальных экспертах такого не бывает.
Изменение порядка выбора ордеров действительно приводит к их закрытию в течении одного тика (код программы и отчёт из журнала тестера привожу ниже).
Мне кажется странным, что в MQL4 нельзя выбирать порядок работы с ордерами, если вы знаете почему подскажите, пожалуйста, т.к. по логике работы эксперта я собираюсь закрывать ордера именно в порядке их открытия.

С уважением. Shurkin. 



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

 for(i=0, int k=0; i<OrdersTotal();i++,k++)//
   {
   Print("Кс2:"," Tick=",Tick," i=",i);//Сообщение
   if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)//Выбор ордера i
    {
   if(OrderSymbol()==Symbol())//Символ
     {
   if(OrderMagicNumber()==Mn)//Идентификационное число
      {
   if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//Тип операции текущего выбранного ордера
       {
   OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);//Закрытие позиции
   k--;
       }//Закрыто if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
      }//Закрыто if(OrderMagicNumber()==Mn)
     }//Закрыто if(OrderSymbol()==Symbol()
    }//Закрыто if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
   }//Закрыто for(i=0;i<OrdersTotal();i++)
 
Gek34:

Доброго времени суток.

Подскажите пожалуста, бывают ли ситуации, когда ДЦ могут изменить или удалить коментарии к  ордеру?

Заранее спасибо. 

 


Имело место полное изменение комментария ордера. Также, при частичном закрытии, иногда обнуляется magic (частичное закрытие инициируется сервером). Сейчас, для контроля последнего висит отдельный, зацикленный советник, который контролирует "чужие" ордера и прочие несоответствия, своевременно извещая Push сообщениями.
 

Подскажите пожалуйста как правильно написать условие:

1.если ордер символ = символ и ордер магик = 135

2.если нет отложенных ордеров БАЙСТОП

3.если нет открытых ордеров БАЙ  ИЛИ (если есть) стоплосс>цены открытия

4.если цена находится между МА и есть фрактал up

СТАВИМ ОТЛОЖЕННЫЙ ОРДЕР BUYSTOP

НАПИСАЛ ВОТ ТАК: 

   

 static bool flag ;

   if(NewBar()==true)

     flag = true; 

     for(int i=0;i<total-1;i++) 

         {

         OrderSelect(i,SELECT_BY_POS); 

          if(OrderSymbol()==Symbol() && OrderMagicNumber()==135) 

          { 

          if(OrderType()<=OP_BUYSTOP) 

           {

           if((OrderType()<=OP_BUY) || (OrderType()==OP_BUY && OrderStopLoss()>OrderOpenPrice()))  

            { 

            if(Ask<m && Ask>ma && frUP>0 && flag)

            {

              double price = NormalizeDouble(frUP+30*Point+(Ask-Bid)*Point,Digits);

             double stoploss = NormalizeDouble(price-sl*Point-30*Point,Digits);

             double takeprofit = NormalizeDouble(price+tp*Point,Digits);

             int ticket = OrderSend(Symbol(),OP_BUYSTOP,Lots,price,5,stoploss,takeprofit,"R",135,TimeCurrent()+55000,Blue);

             if(ticket>0)

               {

               Alert("R!Отложенный ордер BUYSTOP!!! ",Symbol());

               flag = false;

               }

               else

               {

               Print("Lots= ", Lots,"price= ", price,"stoploss= ", stoploss,"takeprofit= ", takeprofit,"Ошибка № ",GetLastError());      

               return;

               }

             }

           }

         }

       }

     } 

 НЕ РАБОТАЕТ!ПОДСКАЖИТЕ ЧЁМ ОШИБКА!

 

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

Есть индикатор, использующий внешние функции. Код откомпилированной библиотеки находится в папке libraries, описатели - в include.

Подключение #include <lib_Zemckikh.mqh>. При первом просчете индикатора все библиотечные функции работают штатно, индикатор отображается на графике. Стоит сменить параметры (заставить повторно просчитать индикатор) вызова библиотечных функций не происходит, индикатор не отображается, на вкладке "Эксперты" после смены параметров никаких записей нет.

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

Не могу понять, что сделано не так. Что бы не засорять форум, коды не прикладываю. Если будет необходимо, сброшу в личку.

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