Ваши вопросы по языку MQL4

max020780

Новичок форума
s - это цена полученная по сигналу
a spred это
PHP:
double spred= (Ask-Bid);

if (spred<0) spred *=(-1);
 

max020780

Новичок форума
так когда советник запущен на одной паре все вроде ок !
как только включаешь вторую получается черти что такое ощущение что перебор ордеров работает коряво както! как можно проверить?
 

eevviill

Заблокирован
так когда советник запущен на одной паре все вроде ок !
как только включаешь вторую получается черти что такое ощущение что перебор ордеров работает коряво както! как можно проверить?
Та вроди нормально фильтруется сивол, даже 2 раза.
Алертом пробуй каждый параметр проверять.
 

AlexeyVik

Программист mql4 mql5
помогите разобраться пытаюсь модифицировать два ордера одновременно один отложенный другой открытый так открытый модифицируется без проблем а отложенный намного позже и в придачу когда советник запущен на нескольких парах он модифицирует отложенный по цене открытого ордера по другой валютной паре если ордера открыты в том же направлении

Код:
if( NumberOfPositionsBay(Symbol())==1 && NumberOfPositionsSell_otl(Symbol())==1 &&GetOrderLotsOtlSell(Symbol())==start_Lot*2 && GetOrderLotsBay(Symbol())==start_Lot)
{

 
      for (int k = 0; k < OrdersTotal(); k++) 
      {
      if (OrderSelect(k,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:
//------------------------------------------------------ 3 --
if (OrderSymbol()!= Symbol()) continue; // Не наш фин.инструм.
      
      if (OrderSymbol() == Symbol() && OrderType() == OP_SELLSTOP ) {
     
      tp_sell_otl=NormalizeDouble(s-(2*Point)-spred-(GetOrderPriceBay(Symbol())-(s-Point-spred))/Point/2*Point, Digits);
      sl_sell_otl=NormalizeDouble(GetOrderPriceBay(Symbol()), Digits);
     [B] ModifyOrder([/B]
      OrderModify(OrderTicket(),[B][COLOR=Red]NormalizeDouble(s-Point-spred, Digits)[/COLOR][/B],sl_sell_otl,tp_sell_otl,0);
       
      }
      
       
       if (OrderSymbol() == Symbol() && OrderType() == OP_BUY  ) {
       
      sl_buy_otl=NormalizeDouble(s-spred-Point, Digits);
      OrderModify(OrderTicket(), [B][COLOR=Red]OrderOpenPrice()[/COLOR][/B],sl_buy_otl,OrderTakeProfit(),0);
      
      }
      }
      }
}
Для начала объясни что такое ModifyOrder(
И почему в одном случае, точней во втором, там где должна быть цена открытия ордера написано OrderOpenPrice() а в первом не понятно что NormalizeDouble(s-Point-spred, Digits)
Даже если это цена открытия ордера правильно будет писать OrderOpenPrice()
И если не трудно вместо тегов PHP используй теги
CODE
s - это цена полученная по сигналу
a spred это
Код:
double spred= (Ask-Bid);

if (spred<0) spred *=(-1);
И зачем такое условие if(spred < 0)??? Разве может быть Ask меньше Bid???

Давай ещё разберём это
NormalizeDouble(s // Если это цена полученная... хорошо.
-Point // А почему ты из этой цены минусуешь Point???
-spred // Ну spred может и надо сминусовать, тебе видней. Пусть будет так.
, Digits)
Но основное это вместо цены открытия ордера не понятно что...
 
Последнее редактирование:

max020780

Новичок форума
написал во так
PHP:
if(NumberOfPositionsSell(Symbol())==1 &&  NumberOfPositionsBay_otl(Symbol())==1  &&GetOrderLotsOtlBay(Symbol())==start_Lot*2  &&GetOrderLotsSell(Symbol())==start_Lot)
{
 
     for (int kk = OrdersTotal()-1; kk >=0 ; kk--) 
      {
      
       if (OrderSelect(kk,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:
      
      if (OrderSymbol() == Symbol() && OrderType() == OP_BUYSTOP ) {
      

      tp_buy_otl=NormalizeDouble(b+((((2*Point)+spred+(b+Point+spred-GetOrderPriceSell(Symbol()))/Point)/2)*Point), Digits);
      sl_buy_otl=NormalizeDouble(GetOrderPriceSell(Symbol()), Digits);
      OrderModify(OrderTicket(), NormalizeDouble(b+Point+spred, Digits),sl_buy_otl,tp_buy_otl,0);
     
       Alert("tp_buy_otl = ",DoubleToStr(tp_buy_otl, Digits)+"\n"+"sl_buy_otl =  ",DoubleToStr(sl_buy_otl, Digits)+"\n"+" цена открытия бай стоп = ",  DoubleToStr(b+Point+spred, Digits)+"\n"+"OrderSymbol() =  ",OrderSymbol()+"\n"+"OrderType() = ",OrderType());
     
      
     }
      
      
      if (OrderSymbol() == Symbol() && OrderType() == OP_SELL ) {
      
      sl_sell_otl=NormalizeDouble(b+spred+Point, Digits);
      OrderModify(OrderTicket(),OrderOpenPrice(), sl_sell_otl,OrderTakeProfit(),0);
       
      }
      }
      }
      
}
а в алерте почемуто OrderSymbol()==GBPUSD посмотрите на скин
да и открытый селл он модифицировал а отложенный нет


как только удалил отложенник по gbpusd и удалил с него советника то ордер сразу по евро модифицировался
 

Вложения

  • 100.jpg
    100.jpg
    134,1 КБ · Просмотры: 16
Последнее редактирование:

max020780

Новичок форума
Для начала объясни что такое ModifyOrder(
И почему в одном случае, точней во втором, там где должна быть цена открытия ордера написано OrderOpenPrice() а в первом не понятно что NormalizeDouble(s-Point-spred, Digits)
Даже если это цена открытия ордера правильно будет писать OrderOpenPrice()
И если не трудно вместо тегов PHP используй теги
CODE

И зачем такое условие if(spred < 0)??? Разве может быть Ask меньше Bid???

Давай ещё разберём это
NormalizeDouble(s // Если это цена полученная... хорошо.
-Point // А почему ты из этой цены минусуешь Point???
-spred // Ну spred может и надо сминусовать, тебе видней. Пусть будет так.
, Digits)
Но основное это вместо цены открытия ордера не понятно что...

s - это цена которую я получаю от индикатора
Point минусую потомучто хочу чтоб на 1 пункт цена была меньше той что дал индикатор по этому и получается что для отложенного ордера я вычисляю цену открытия а для того что уже открыт модифицирую только стоп лосс и тейк профит
ModifyOrder( - просто забыл удалить
 

eevviill

Заблокирован
написал во так ...а в алерте почемуто OrderSymbol()==GBPUSD посмотрите на скин
да и открытый селл он модифицировал а отложенный нет


как только удалил отложенник по gbpusd и удалил с него советника то ордер сразу по евро модифицировался
В строку алерта ещё допиши Symbol()
 

Milord

Местный знаток
Это глюк МТ4???

кто то сталкивался с тем что при оптимизации тестер выдает каждый раз разные результаты,причем никакие параметры не меняю, просто нажимаю кнопку "СТАРТ", версия билда МТ4 509, в попытке выяснить причину такого поведения, написал простой код, и решил глянуть цену закрытия 1 бара, итог поверг в шок, в журнале цена закрытия 1 бара имеет несколько значений, как такое может быть вапще???:not-good:
подскажите плиз, в чем причина разных значений цены закрытия, при прогонах кода, интернет был отключен и новые котировки не поступали...
PHP:
int init()
  {
   return(0);
  }
int deinit()
  {
   return(0);
  }
int start()
  {
//----
   Print("цена закрытия 1 бара=",Close[1]);
//----
   return(0);
  }
в котировках последний(1) бар, на М30, цена закрытия имеет значение 1.3741
ниже результаты работы кода:
 

Вложения

  • Screenshot - 14_12.jpg
    Screenshot - 14_12.jpg
    103,3 КБ · Просмотры: 18
Последнее редактирование:

Ugar

Гуру форума
кто то сталкивался с тем что при оптимизации тестер выдает каждый раз разные результаты,причем никакие параметры не меняю, просто нажимаю кнопку "СТАРТ", версия билда МТ4 509, в попытке выяснить причину такого поведения, написал простой код, и решил глянуть цену закрытия 1 бара, итог поверг в шок, в журнале цена закрытия 1 бара имеет несколько значений, как такое может быть вапще???:not-good:
подскажите плиз, в чем причина разных значений цены закрытия, при прогонах кода, интернет был отключен и новые котировки не поступали...
PHP:
int init()
  {
   return(0);
  }
int deinit()
  {
   return(0);
  }
int start()
  {
//----
   Print("цена закрытия 1 бара=",Close[1]);
//----
   return(0);
  }
в котировках последний(1) бар, на М30, цена закрытия имеет значение 1.3741
ниже результаты работы кода:
Это скорее глюк программиста. Номер бара вообще то динамический. Тестер во время теста, моделирует появление новых баров, соответственно 1 бар становится другим.
В реальности так же. С появлением нового бара, нумерация сдвигается.
Если нужно получать цену одного и того же бара нужно привязываться не к номеру бара, а к времени открытия бара.

А что бы при каждом тестировании получать одинаковый результат, нужно задать в тестере фиксированный спред.
Или тестировать в выходные.
 
Последнее редактирование:

Milord

Местный знаток
....
А что бы при каждом тестировании получать одинаковый результат, нужно задать в тестере фиксированный спред.
Или тестировать в выходные.
спасибо за пояснение,про моделирование прихода котировок я не подумал)):D
на счет одинаковых результатов в выходные, не факт, именно на выходных и оптил, единственно не смотрел какой спред при оптении был в тестере...
 

AlexeyVik

Программист mql4 mql5
s - это цена которую я получаю от индикатора
Point минусую потомучто хочу чтоб на 1 пункт цена была меньше той что дал индикатор по этому и получается что для отложенного ордера я вычисляю цену открытия а для того что уже открыт модифицирую только стоп лосс и тейк профит
Ну, хорошо. Я был не достаточно внимателен, оказывается ты хочешь переставить отложник на новое место. Я прочёл как ордер OP_BUY

А вот
ModifyOrder( - просто забыл удалить
это скорее всего ты пудришь нам мозги. В твоём варианте ты переходишь в другую функцию где и происходит путаница символа, а нам показываешь модификацию строкой OrderModify()
 

Ugar

Гуру форума
спасибо за пояснение,про моделирование прихода котировок я не подумал)):D
на счет одинаковых результатов в выходные, не факт, именно на выходных и оптил, единственно не смотрел какой спред при оптении был в тестере...
В выходные спред не должен меняться. Хотя, мало ли что там сотрудники ДЦ творят с сервером. Лучше использовать не текущий спред, а задать какой то фиксированный, близкий к среднему.
Ещё, в советнике может быть применён рандомный вход, теоретически, при каждом запуске, результат должен отличаться. На практике не всегда, зависит от способа инициализации рандом генератора.
 

Milord

Местный знаток
В выходные спред не должен меняться. Хотя, мало ли что там сотрудники ДЦ творят с сервером. Лучше использовать не текущий спред, а задать какой то фиксированный, близкий к среднему.
Ещё, в советнике может быть применён рандомный вход, теоретически, при каждом запуске, результат должен отличаться. На практике не всегда, зависит от способа инициализации рандом генератора.
код я писал сам,там никаких рандомов небыло, но при каждом запуске оптимизации, наилучший результат по балансу менялся, ощущение, что тестер проганивает его по меняющимся котировкам, но самое интересное дальше, не меняя настроек в тестере, то есть периода оптимизации,спреда...
закидываю на оптение обычный Илан, и в нем почему то не меняется результат оптимизации, в моем же каждый раз разное значение...:facepalm:
 
Последнее редактирование:

max020780

Новичок форума
Ну, хорошо. Я был не достаточно внимателен, оказывается ты хочешь переставить отложник на новое место. Я прочёл как ордер OP_BUY

А вот это скорее всего ты пудришь нам мозги. В твоём варианте ты переходишь в другую функцию где и происходит путаница символа, а нам показываешь модификацию строкой OrderModify()

никому ничего не пудрю а пытаюсь разобраться от куда выскакивает этот глюк на ModifyOrder( не нужно ссылаться оно тут не причем его уже нет в коде я просто пробывал функцию KIMIVa вставить думал что OrderModify() как то не верно оформил а оказалось что и с его функцией тоже самое . лучшеб не критиковали а указали конкретно почему так происходит когда советник работает на двух и более парах
судя из логики если я правильно понимаю что при равенстве OrderSymbol()==GBPUSD если это пара евродоллар он в аллерт вообще не должен попадать а он попадает или если я не прав поправьте
PHP:
if(NumberOfPositionsSell(Symbol())==1 &&  NumberOfPositionsBay_otl(Symbol())==1  &&GetOrderLotsOtlBay(Symbol())==start_Lot*2  &&GetOrderLotsSell(Symbol())==start_Lot)
{
 
     for (int kk = OrdersTotal()-1; kk >=0 ; kk--) 
      {
      
       if (OrderSelect(kk,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:
      
      if (OrderSymbol() == Symbol() && OrderType() == OP_BUYSTOP ) {
      

      tp_buy_otl=NormalizeDouble(b+((((2*Point)+spred+(b+Point+spred-GetOrderPriceSell(Symbol()))/Point)/2)*Point), Digits);
      sl_buy_otl=NormalizeDouble(GetOrderPriceSell(Symbol()), Digits);
      OrderModify(OrderTicket(), NormalizeDouble(b+Point+spred, Digits),sl_buy_otl,tp_buy_otl,0);
     
       Alert("tp_buy_otl = ",DoubleToStr(tp_buy_otl, Digits)+"\n"+"sl_buy_otl =  ",DoubleToStr(sl_buy_otl, Digits)+"\n"+" цена открытия бай стоп = ",  DoubleToStr(b+Point+spred, Digits)+"\n"+"OrderSymbol() =  ",OrderSymbol()+"\n"+"OrderType() = ",OrderType());
     
      
     }
      
      
      if (OrderSymbol() == Symbol() && OrderType() == OP_SELL ) {
      
      sl_sell_otl=NormalizeDouble(b+spred+Point, Digits);
      OrderModify(OrderTicket(),OrderOpenPrice(), sl_sell_otl,OrderTakeProfit(),0);
       
      }
      }
      }
      
}
 

Вложения

  • 100.jpg
    100.jpg
    134,1 КБ · Просмотры: 20

Ugar

Гуру форума
код я писал сам,там никаких рандомов небыло, но при каждом запуске оптимизации, наилучший результат по балансу менялся, ощущение, что тестер проганивает его по меняющимся котировкам, но самое интересное дальше, не меняя настроек в тестере, то есть периода оптимизации,спреда...
закидываю на оптение обычный Илан, и в нем почему то не меняется результат оптимизации, в моем же каждый раз разное значение...:facepalm:
Аааа, при оптимизации. Поди что генетический алгоритм включен?
 

Milord

Местный знаток
Аааа, при оптимизации. Поди что генетический алгоритм включен?
конечно включен)):D как и положено, а иначе резы будут через неделю машинного времени))
просто неясно как так может быть, если участок (период) оптимизации неизменен, неизменный спред и параметры в тестере, вернее их рамки, но при каждом нажатии на кнопку "старт оптимизации" -получаются разные резы)):not-good::facepalm:это в моей сове, в илане не меняются резы, странно))где же глюк???))почитал ветку метаквотов _http://forum.mql4.com/ru/58760/page126 об новых билдах МТ4, после 509, у меня он стоит, чуть волосы дыбом не встали, все глючит там по отзывам трейдеров и графика и функции...:facepalm:
 
Последнее редактирование:

Ugar

Гуру форума
конечно включен)):D как и положено, а иначе резы будут через неделю машинного времени))
просто неясно как так может быть, если участок (период) оптимизации неизменен, неизменный спред и параметры в тестере, вернее их рамки, но при каждом нажатии на кнопку "старт оптимизации" -получаются разные резы)):not-good::facepalm:это в моей сове, в илане не меняются резы, странно))где же глюк???))почитал ветку метаквотов _http://forum.mql4.com/ru/58760/page126 об новых билдах МТ4, после 509, у меня он стоит, чуть волосы дыбом не встали, все глючит там по отзывам трейдеров и графика и функции...:facepalm:
А говорил никакого рандома. В советнике нет рандома, так в генетическом алгоритме он есть.
Генети́ческий алгори́тм (англ. genetic algorithm) — это эвристический алгоритм поиска, используемый для решения задач оптимизации и моделирования путём случайного подбора, комбинирования и вариации искомых параметров с использованием механизмов, аналогичных естественному отбору в природе.
 

Milord

Местный знаток
А говорил никакого рандома. В советнике нет рандома, так в генетическом алгоритме он есть.
каюсь)):D
про генетику я не думал, что "собака" зарыта именно там,Илан то не менял свои резы при включенной генетике..))
надо будет снова вернутся к своей сове, и вырубить генетику, вдруг и правда она виноватая))
 

AlexeyVik

Программист mql4 mql5
никому ничего не пудрю а пытаюсь разобраться от куда выскакивает этот глюк на ModifyOrder( не нужно ссылаться оно тут не причем его уже нет в коде я просто пробывал функцию KIMIVa вставить думал что OrderModify() как то не верно оформил а оказалось что и с его функцией тоже самое . лучшеб не критиковали а указали конкретно почему так происходит когда советник работает на двух и более парах
судя из логики если я правильно понимаю что при равенстве OrderSymbol()==GBPUSD если это пара евродоллар он в аллерт вообще не должен попадать а он попадает или если я не прав поправьте
Код:
if(NumberOfPositionsSell(Symbol())==1 &&  NumberOfPositionsBay_otl(Symbol())==1  &&GetOrderLotsOtlBay(Symbol())==start_Lot*2  &&GetOrderLotsSell(Symbol())==start_Lot)
{
 
     for (int kk = OrdersTotal()-1; kk >=0 ; kk--) 
      {
      
       if (OrderSelect(kk,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:
      
      if (OrderSymbol() == Symbol() && OrderType() == OP_BUYSTOP ) {
      

      tp_buy_otl=NormalizeDouble(b+((((2*Point)+spred+(b+Point+spred-[COLOR=Red][B]GetOrderPriceSell(Symbol())[/B][/COLOR])/Point)/2)*Point), Digits);
      sl_buy_otl=NormalizeDouble([COLOR=Red][B]GetOrderPriceSell(Symbol())[/B][/COLOR], Digits);
      OrderModify(OrderTicket(), NormalizeDouble(b+Point+spred, Digits),sl_buy_otl,tp_buy_otl,0);
     
       Alert("tp_buy_otl = ",DoubleToStr(tp_buy_otl, Digits)+"\n"+"sl_buy_otl =  ",DoubleToStr(sl_buy_otl, Digits)+"\n"+" цена открытия бай стоп = ",  DoubleToStr(b+Point+spred, Digits)+"\n"+"OrderSymbol() =  ",OrderSymbol()+"\n"+"OrderType() = ",OrderType());
     
      
     }
      
      
      if (OrderSymbol() == Symbol() && OrderType() == OP_SELL ) {
      
      sl_sell_otl=NormalizeDouble(b+spred+Point, Digits);
      OrderModify(OrderTicket(),OrderOpenPrice(), sl_sell_otl,OrderTakeProfit(),0);
       
      }
      }
      }
      
}
Ну давай без обид. На первый взгляд написано без ошибок, но ведь чудес на свете не бывает... Значит где-то у тебя происходит выбор другого ордера. Проверь функции выделенные мной жирным красным шрифтом в твоём коде. Вероятно там. Для начала замени это конкретной ценой, или вычисли эту цену до того как...
В общем велика вероятность того, что в этой функции происходит перевыбор символа.
Ну или в тупую поставь перед OrderModify дополнительный раз OrderSelect(kk,...

И ещё раз прошу тебя, если не трудно не пользуйся тегами PHP пользуйся тегами CODE Кнопка находится через одну от PHP влево и имеет значёк #
 
Верх