Обучение языку MQL4 под MetaTrader 4📌

От xbms, 13 апреля, 2013 в Уголок Программиста

#2701

Я тоже логику не понял, но решил промолчать - мало ли, может там какая-то хитрая мысль, не изложенная в описании. Но похоже в данном случае моя излишняя вежливость может и не нужна :-b

Изменено 29 октября, 2015 пользователем st2050

#2702


ПС: зачем Вам Sleep(20000);?


:d зачем вообще всё это?!
#2703

Слип нужен был чтоб он открывал ордера с задержкой так как он их открывал просто пачками.
Зачем это нужно ? У меня есть сова которая показывает очень хорошие результаты но работает без мэджика и на одном графике...

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

int order_type=OrderType();

int _GetLastError=0,_OrdersTotal=OrdersTotal();
int countSS=0, countBS=0;
for(int z=_OrdersTotal+1; z>=0; z ++)
{

if(OrderSelect(z,SELECT_BY_POS))
{

// вот проверка что ордер отложенный
if (order_type==OP_BUYSTOP || order_type==OP_BUYLIMIT || order_type==OP_SELLSTOP || order_type==OP_SELLLIMIT){


//---- если позиция открыта не по текущему инструменту, пропускаем её
if(OrderSymbol()!=Symbol()) continue;

//---- если MagicNumber не равен Expert_ID, пропускаем эту позицию
if(OrderMagicNumber()!=Magic) continue;

if (order_type==OP_BUYSTOP) countBS++;
if (order_type==OP_SELLSTOP) countSS++;

}}

else
{
if (countBS == 0) order=OrderSend(Symbol(),OP_BUYSTOP,Lots*0.1,Ask+Otstup*Point,3,0,0,"",Magic,0,Green);
if (countSS == 0) order=OrderSend(Symbol(),OP_SELLSTOP,Lots*0.1,Bid-Otstup*Point,3,0,0,"",Magic,0,Green);
}

}

#2704

int order_type=OrderType();
int _OrdersTotal=OrdersTotal();
int countSS=0, countBS=0;
for(int z=_OrdersTotal+1; z>=0; z ++)
{
if(OrderSelect(z,SELECT_BY_POS))
{

//---- если позиция открыта не по текущему инструменту, пропускаем её
if(OrderSymbol()!=Symbol()) continue;

//---- если MagicNumber не равен Expert_ID, пропускаем эту позицию
if(OrderMagicNumber()!=Magic) continue;

if (order_type==OP_BUYSTOP) countBS++;
if (order_type==OP_SELLSTOP) countSS++;

}
}

if (countBS == 0) order=OrderSend(Symbol(),OP_BUYSTOP,Lots*0.1,Ask+Otstup*Point,3,0,0,"",Magic,0,Green);
if (countSS == 0) order=OrderSend(Symbol(),OP_SELLSTOP,Lots*0.1,Bid-Otstup*Point,3,0,0,"",Magic,0,Green);

#2705


int order_type=OrderType();
int _OrdersTotal=OrdersTotal();
int countSS=0, countBS=0;
for(int z=_OrdersTotal+1; z>=0; z ++)
{
if(OrderSelect(z,SELECT_BY_POS))
{

//---- если позиция открыта не по текущему инструменту, пропускаем её
if(OrderSymbol()!=Symbol()) continue;

//---- если MagicNumber не равен Expert_ID, пропускаем эту позицию
if(OrderMagicNumber()!=Magic) continue;

if (order_type==OP_BUYSTOP) countBS++;
if (order_type==OP_SELLSTOP) countSS++;

}
}

if (countBS == 0) order=OrderSend(Symbol(),OP_BUYSTOP,Lots*0.1,Ask+Otstup*Point,3,0,0,"",Magic,0,Green);
if (countSS == 0) order=OrderSend(Symbol(),OP_SELLSTOP,Lots*0.1,Bid-Otstup*Point,3,0,0,"",Magic,0,Green);



Всеравно открывает безконечно

Изменено 29 октября, 2015 пользователем grave

#2706



int order_type=OrderType();
int _OrdersTotal=OrdersTotal();
int countSS=0, countBS=0;
for(int z=_OrdersTotal+1; z>=0; z ++)
{
if(OrderSelect(z,SELECT_BY_POS))
{

//---- если позиция открыта не по текущему инструменту, пропускаем её
if(OrderSymbol()!=Symbol()) continue;

//---- если MagicNumber не равен Expert_ID, пропускаем эту позицию
if(OrderMagicNumber()!=Magic) continue;

if (order_type==OP_BUYSTOP) countBS++;
if (order_type==OP_SELLSTOP) countSS++;

}
}

if (countBS == 0) order=OrderSend(Symbol(),OP_BUYSTOP,Lots*0.1,Ask+Otstup*Point,3,0,0,"",Magic,0,Green);
if (countSS == 0) order=OrderSend(Symbol(),OP_SELLSTOP,Lots*0.1,Bid-Otstup*Point,3,0,0,"",Magic,0,Green);



Всеравно открывает безконечно , если я не ошибаюсь то order_type==OP_BUYSTOP не может быть так как order_type равен цифре или я не прав ?

OP_BUYSTOP - это константа
Конечно такое условие будет бесконечным for(int z=_OrdersTotal+1; z>=0; z ++) вы же постоянно увеличиваете индекс.
#2707
grave будьте внимательны.
Вот Qj очень внимателен. Я, проверяя логику часто не замечаю очевидных ошибок...
Надо:
- в описании цикла писать "z--".
- и присвоить переменной order_type значение внутри цикла, после выбора ордера.
#2708

Заработало =)
Огромнейшее спасибо!!! <:-p>

#2709


Заработало =)
Огромнейшее спасибо!!! <:-p>


И где полученный результат, верный код?

Выложите итоговый файл - может кто-то что-то еще предложит, подкрутит.
#2710


Друзья, здравствуйте! Помогите советом: есть робот, который работает так как и нужно, когда на счете только он один и на одной паре. Но как только стоит его же запустить на другую пару этого же счета, то все начинает глючить - выдает ошибку "не правильных параметров" (err 3). Хотя, магики разные... даже, специально сделал для каждой пары своего, отдельного, чтоб он не путался, но не помогло... Кто знает, как можно это исправить???? Цель - один робот на одном счете работает на разных параз. Заранее, благодарю.


Куски кода представить можете? Ибо мы тут не экстрасенсы.
#2711

Хахаха. Невнимательность к деталям - будни прикладного программиста. Это уже стиль работы - главное рыбу написать, а косяки при отладке повылазят.
Сначала делаем грабли, а потом с ними героически боремся и всем рассказываем с умным видом, какое оно сложное - программирование 8-}

Вспомнился мульфильм "И так сойдет":
[SPOILER]


[SPOILER]

Изменено 30 октября, 2015 пользователем st2050

#2712

Куски кода представить можете? Ибо мы тут не экстрасенсы.


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

F_eur.gbp.mq410 скач.

#2713
Цитата



Куски кода представить можете? Ибо мы тут не экстрасенсы.



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


Мало информации. Не понятно где и как присваиваются передаваемые параметры и вы уверены что в этом методе ошибки?

Добавлено: 31-10-2015 13:43:20

Я везде вижу что при закрытие пачки ордеров или их изменение всегда ставят sleep. Вопрос такой нужен ли он вообще?

Изменено 31 октября, 2015 пользователем Qj

#2714



Заработало =)
Огромнейшее спасибо!!! <:-p>


И где полученный результат, верный код?

Выложите итоговый файл - может кто-то что-то еще предложит, подкрутит.


Вот итоговый код
int _OrdersTotal=OrdersTotal();
int countSS=0, countBS=0;
for(int z=_OrdersTotal+1; z>=0; z --)
{
if(OrderSelect(z,SELECT_BY_POS))
{
//---- если позиция открыта не по текущему инструменту, пропускаем её
if(OrderSymbol()!=Symbol()) continue;

//---- если MagicNumber не равен Expert_ID, пропускаем эту позицию
if(OrderMagicNumber()!=Magic) continue;
int order_type=OrderType();
if (order_type==OP_BUYSTOP) countBS++;
if (order_type==OP_SELLSTOP) countSS++;
}
}

if (countBS == 0) order=OrderSend(Symbol(),OP_BUYSTOP,Lots*0.1,Ask+Otstup*Point,3,0,0,Magic+" "+Symbol(),Magic,0,Green);
if (countSS == 0) order=OrderSend(Symbol(),OP_SELLSTOP,Lots*0.1,Bid-Otstup*Point,3,0,0,Magic+" "+Symbol(),Magic,0,Green);

Сама сова называется ambush можно ее найти на оф сайте mt4 , выложить ее не могу так как парюсь над ней уже 2 месяца (сама идея совы очень понравилась) и как кто-то писал на этом форуме , чем меньше людей знает о тс тем дольше она работает.
PS. самый сок в том что она не зависит от тренда и не использует мм

1.jpg

Изменено 30 октября, 2015 пользователем grave

#2715


Сама сова называется ambush можно ее найти на оф сайте mt4 , выложить ее не могу так как парюсь над ней уже 2 месяца (сама идея совы очень понравилась) и как кто-то писал на этом форуме , чем меньше людей знает о тс тем дольше она работает.


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

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

https://www.mql5.com/ru/code/9561 этот? выглядит сыровато...

grave, /laboratoriya-profitfx/24/open-source-sovetnik-forex-aspid-ili-gad-polzuchiy/3260/?do=findComment&comment=50551 этот на голову лучше, имхо.
Ваш секрет скоро как 3 года уже реализован на форуме - пользуйтесь на здоровье! :)

Изменено 30 октября, 2015 пользователем Старик

#2716
grave тестируйте с качеством 99%, ибо с плохим качеством тестирования мы уже много граалей видели... и на основе ловли импульса в том числе.
Удачи.
#2717

Ладно , так тому и быть выкладываю сову. Потерял свой депозит на советнике forex hero AC еще пол года назад и еще не скоро насобираю на новый так что ловите.
Крайне интересно испытать его на реале, тестер почему-то больше 76% не моделирует. Кто всетаки скачает и начнет гонять его выкладывайте результаты сюда.

Логика советника по стопам устроена так, он отдает один процент дэпо за возможность получить пятнадцать ну или тралит от 1 до 15 % при открытии сделки.Крайне эффективен при авто лоте.

Что я дописал и изменил:

Авто лот ставим ноль или пишем свой
прописан мэджик и открытие ордеров при отсутствии (не без вашей помощи =) )
перепрописал слип по моему мнению лучше 60000
убрал стрелочный флуд (раньше рисовал стрелки при смещении сс или бс)
также некоторые функции работали только на тестере , перепрописал чтоб и в реальной торговле их использовал.
тайм фрейм советую 15м пара EURUSD
Разрешить импорт из DLL

там есть вот такой момент

if(((AccountEquity()-AccountBalance())>KO*PK) || (AccountEquity()-AccountBalance())
{
if(OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)),3);
if(OrderType()==OP_SELL) result= OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)),30);

if(OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP) OrderDelete(OrderTicket());

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

Изменено 7 ноября, 2015 пользователем grave

#2718
grave, я бы вам рекомендовал присмотреться к Аспиду, ссылку на который я дал.
Там нормальный код и достаточно большие возможности.

Ваш бот собран из фрагментов кода 2005-2006-2008 годов.
В принципе код рабочий, но совсем раритетный.
И, заметьте, за очень много лет ваш бот вроде никого не заинтересовал и развития не получил - что напрягает.

Можно, конечно, бота выложить здесь - может кто-то и посоветует. Но здесь народ тестами не занимается.

Если хотите, чтобы бота кто-то потестил и что-то посоветовал, то выложите бота в Лаборатория ProfitFX.
Там народ быстро диагноз поставит.
#2719


grave, я бы вам рекомендовал присмотреться к Аспиду, ссылку на который я дал.
Там нормальный код и достаточно большие возможности.

Ваш бот собран из фрагментов кода 2005-2006-2008 годов.
В принципе код рабочий, но совсем раритетный.
И, заметьте, за очень много лет ваш бот вроде никого не заинтересовал и развития не получил - что напрягает.

Можно, конечно, бота выложить здесь - может кто-то и посоветует. Но здесь народ тестами не занимается.

Если хотите, чтобы бота кто-то потестил и что-то посоветовал, то выложите бота в Лаборатория ProfitFX.
Там народ быстро диагноз поставит.


Потестил сову на которую вы дали ссылку , просто космические результаты какие-то , вы его используете на реальном счете ? Неужели все так или есть подводные камни ?
#2720

я не использую данного бота, так как он (в существенной части по моей вине) не был доработан до следующего уровня.
до сих пор мои предложения к боту я так и не выписал в полном объеме - правда, пытаюсь это сделать в общем виде, что намного сложнее.

Но бота писал компетентный человек и бот, на текущем уровне, вполне неплох.
И рынок сейчас более-менее трендовый.
Имхо, бота просто недораскрутили-недоработали.

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

#2721


Я везде вижу что при закрытие пачки ордеров или их изменение всегда ставят sleep. Вопрос такой нужен ли он вообще?

Я думаю Qj не нуждается в моём ответе, но поясню для начинающих читателей:
функция Слип вешает экспертный поток терема, остаются в работе только МТ функции по приёму и отображению котировок, ручной режим, скрипты и индюки вызванные вручную. Все эксперты - висят. Не надо злоупотреблять этой функцией. её используют только при ошибках (при выставлении торговых приказов), но не всех, а только связанных со связью мт и сервера, например занятость потока, обрыв связи и т.д.
Иногда используют при реквоте или другими ошибками в цене, но я рекомендую ставить флаг и дождаться нового тика по символу и сразу (по флагу) переходить к отложенной процедуре открытия ордера - т.е. не использовать Слип, а дать возможность другим совам в терминале отработать свой код.
Всё имхо.
ПС: это касается только МТ4

Изменено 1 ноября, 2015 пользователем 0ll

#2722

Полностью согласен. Тоже к этому пришёл, самое оптимальное решение.

#2723
Спойлер



Я везде вижу что при закрытие пачки ордеров или их изменение всегда ставят sleep. Вопрос такой нужен ли он вообще?

Я думаю Qj не нуждается в моём ответе, но поясню для начинающих читателей:
функция Слип вешает экспертный поток терема, остаются в работе только МТ функции по приёму и отображению котировок, ручной режим, скрипты и индюки вызванные вручную. Все эксперты - висят. Не надо злоупотреблять этой функцией. её используют только при ошибках (при выставлении торговых приказов), но не всех, а только связанных со связью мт и сервера, например занятость потока, обрыв связи и т.д.
Иногда используют при реквоте или другими ошибками в цене, но я рекомендую ставить флаг и дождаться нового тика по символу и сразу (по флагу) переходить к отложенной процедуре открытия ордера - т.е. не использовать Слип, а дать возможность другим совам в терминале отработать свой код.
Всё имхо.
ПС: это касается только МТ4

Получается если я обновляю ТП в сетке ордеров к примеру 20 без sleep, то не возникнет ошибки что слишком много запросов к серверу?
#2724


Получается если я обновляю ТП в сетке ордеров к примеру 20 без sleep, то не возникнет ошибки что слишком много запросов к серверу?

Это зависит от многих факторов, в том числе настроек сервака, пинга и т.д. Надо пробовать...
Можно воткнуть миллисекундный таймер и при следующем запросе вычислять разницу Х в мсек, если менее 500 мсек, то спать (500 - Х). Полсекунды достаточное время для сервака?
#2725

Спасибо за совет, друзья!!!)) завтра переделаю, может и правда все из-за "Sleep"...

Для публикации сообщений создайте учётную запись или авторизуйтесь

Перейти к списку тем
Форум · 2.0.20260627.0025