Ну тогда гляди ошибки в журнале.s - это цена полученная по сигналу
a spred этоPHP:double spred= (Ask-Bid); if (spred<0) spred *=(-1);
Та вроди нормально фильтруется сивол, даже 2 раза.так когда советник запущен на одной паре все вроде ок !
как только включаешь вторую получается черти что такое ощущение что перебор ордеров работает коряво както! как можно проверить?
Для начала объясни что такое ModifyOrder(помогите разобраться пытаюсь модифицировать два ордера одновременно один отложенный другой открытый так открытый модифицируется без проблем а отложенный намного позже и в придачу когда советник запущен на нескольких парах он модифицирует отложенный по цене открытого ордера по другой валютной паре если ордера открыты в том же направлении
Код: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); } } } }
И зачем такое условие if(spred < 0)??? Разве может быть Ask меньше Bid???s - это цена полученная по сигналу
a spred этоКод:double spred= (Ask-Bid); if (spred<0) spred *=(-1);
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);
}
}
}
}
Для начала объясни что такое ModifyOrder(
И почему в одном случае, точней во втором, там где должна быть цена открытия ордера написано OrderOpenPrice() а в первом не понятно что NormalizeDouble(s-Point-spred, Digits)
Даже если это цена открытия ордера правильно будет писать OrderOpenPrice()
И если не трудно вместо тегов PHP используй теги CODE
И зачем такое условие if(spred < 0)??? Разве может быть Ask меньше Bid???
Давай ещё разберём это
NormalizeDouble(s // Если это цена полученная... хорошо.
-Point // А почему ты из этой цены минусуешь Point???
-spred // Ну spred может и надо сминусовать, тебе видней. Пусть будет так.
, Digits)
Но основное это вместо цены открытия ордера не понятно что...
В строку алерта ещё допиши Symbol()написал во так ...а в алерте почемуто OrderSymbol()==GBPUSD посмотрите на скин
да и открытый селл он модифицировал а отложенный нет
как только удалил отложенник по gbpusd и удалил с него советника то ордер сразу по евро модифицировался
int init()
{
return(0);
}
int deinit()
{
return(0);
}
int start()
{
//----
Print("цена закрытия 1 бара=",Close[1]);
//----
return(0);
}
Это скорее глюк программиста. Номер бара вообще то динамический. Тестер во время теста, моделирует появление новых баров, соответственно 1 бар становится другим.кто то сталкивался с тем что при оптимизации тестер выдает каждый раз разные результаты,причем никакие параметры не меняю, просто нажимаю кнопку "СТАРТ", версия билда МТ4 509, в попытке выяснить причину такого поведения, написал простой код, и решил глянуть цену закрытия 1 бара, итог поверг в шок, в журнале цена закрытия 1 бара имеет несколько значений, как такое может быть вапще???:not-good:
подскажите плиз, в чем причина разных значений цены закрытия, при прогонах кода, интернет был отключен и новые котировки не поступали...
в котировках последний(1) бар, на М30, цена закрытия имеет значение 1.3741PHP:int init() { return(0); } int deinit() { return(0); } int start() { //---- Print("цена закрытия 1 бара=",Close[1]); //---- return(0); }
ниже результаты работы кода:
спасибо за пояснение,про моделирование прихода котировок я не подумал))....
А что бы при каждом тестировании получать одинаковый результат, нужно задать в тестере фиксированный спред.
Или тестировать в выходные.
Ну, хорошо. Я был не достаточно внимателен, оказывается ты хочешь переставить отложник на новое место. Я прочёл как ордер OP_BUYs - это цена которую я получаю от индикатора
Point минусую потомучто хочу чтоб на 1 пункт цена была меньше той что дал индикатор по этому и получается что для отложенного ордера я вычисляю цену открытия а для того что уже открыт модифицирую только стоп лосс и тейк профит
это скорее всего ты пудришь нам мозги. В твоём варианте ты переходишь в другую функцию где и происходит путаница символа, а нам показываешь модификацию строкой OrderModify()ModifyOrder( - просто забыл удалить
В выходные спред не должен меняться. Хотя, мало ли что там сотрудники ДЦ творят с сервером. Лучше использовать не текущий спред, а задать какой то фиксированный, близкий к среднему.спасибо за пояснение,про моделирование прихода котировок я не подумал))
на счет одинаковых результатов в выходные, не факт, именно на выходных и оптил, единственно не смотрел какой спред при оптении был в тестере...
код я писал сам,там никаких рандомов небыло, но при каждом запуске оптимизации, наилучший результат по балансу менялся, ощущение, что тестер проганивает его по меняющимся котировкам, но самое интересное дальше, не меняя настроек в тестере, то есть периода оптимизации,спреда...В выходные спред не должен меняться. Хотя, мало ли что там сотрудники ДЦ творят с сервером. Лучше использовать не текущий спред, а задать какой то фиксированный, близкий к среднему.
Ещё, в советнике может быть применён рандомный вход, теоретически, при каждом запуске, результат должен отличаться. На практике не всегда, зависит от способа инициализации рандом генератора.
Ну, хорошо. Я был не достаточно внимателен, оказывается ты хочешь переставить отложник на новое место. Я прочёл как ордер OP_BUY
А вот это скорее всего ты пудришь нам мозги. В твоём варианте ты переходишь в другую функцию где и происходит путаница символа, а нам показываешь модификацию строкой OrderModify()
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);
}
}
}
}
Аааа, при оптимизации. Поди что генетический алгоритм включен?код я писал сам,там никаких рандомов небыло, но при каждом запуске оптимизации, наилучший результат по балансу менялся, ощущение, что тестер проганивает его по меняющимся котировкам, но самое интересное дальше, не меняя настроек в тестере, то есть периода оптимизации,спреда...
закидываю на оптение обычный Илан, и в нем почему то не меняется результат оптимизации, в моем же каждый раз разное значение...:facepalm:
конечно включен)) как и положено, а иначе резы будут через неделю машинного времени))Аааа, при оптимизации. Поди что генетический алгоритм включен?
А говорил никакого рандома. В советнике нет рандома, так в генетическом алгоритме он есть.конечно включен)) как и положено, а иначе резы будут через неделю машинного времени))
просто неясно как так может быть, если участок (период) оптимизации неизменен, неизменный спред и параметры в тестере, вернее их рамки, но при каждом нажатии на кнопку "старт оптимизации" -получаются разные резы)):not-good::facepalm:это в моей сове, в илане не меняются резы, странно))где же глюк???))почитал ветку метаквотов _http://forum.mql4.com/ru/58760/page126 об новых билдах МТ4, после 509, у меня он стоит, чуть волосы дыбом не встали, все глючит там по отзывам трейдеров и графика и функции...:facepalm:
Генети́ческий алгори́тм (англ. genetic algorithm) — это эвристический алгоритм поиска, используемый для решения задач оптимизации и моделирования путём случайного подбора, комбинирования и вариации искомых параметров с использованием механизмов, аналогичных естественному отбору в природе.
каюсь))А говорил никакого рандома. В советнике нет рандома, так в генетическом алгоритме он есть.
Ну давай без обид. На первый взгляд написано без ошибок, но ведь чудес на свете не бывает... Значит где-то у тебя происходит выбор другого ордера. Проверь функции выделенные мной жирным красным шрифтом в твоём коде. Вероятно там. Для начала замени это конкретной ценой, или вычисли эту цену до того как...никому ничего не пудрю а пытаюсь разобраться от куда выскакивает этот глюк на 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); } } } }