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

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

#2276

0ll уже не знаю что не так.

Изменено 22 июня, 2015 пользователем Dron15

#2277


0ll уже не знаю что не так.

if(OrderStopLoss()
if(OrderStopLoss()
f(OrderStopLoss()



Вполне возможно ,что не работает вот из-за этой строчки if(OrderOpenPrice()
Вы TrailingStop на Point не умножили!!!
#2278
Dron15 просто делай так:
if(OrderType() == OP_BUY)
{
if(OrderOpenPrice() {
if(OrderStopLoss() если и после этого работать не будет, давай всю сову в .mq4
#2279


Dron15 просто делай так:
if(OrderType() == OP_BUY)
{
if(OrderOpenPrice() {
if(OrderStopLoss() если и после этого работать не будет, давай всю сову в .mq4



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

исправил.txt8 скач.
SNAG-15062218503000.png

#2280

Еще раз всем добрый день.
Попробовав свои силы, пришел к решению, что нужно попрактиковаться на чем-то попроще, чем советник. Хотя с "подхватом" ордеров справился. Спасибо за советы и моральную поддержку.
Решил написать простенький скрипт, который открывал бы ордер с рынка на продажу, выставлял стоп за ближайший минимум и профит в 4 раза больше стопа.

Но что-то не так. Ордер открывается, в нужную сторону, даже СЛ и ТП ставятся... но слишком далеко. Боюсь, что я так и не понял, как правильно выставлять, а точнее логически прописывать установку, стопов. Или что-то еще не так?

Скрипт во вложении.
Заранее спасибо за помощь.

Test_Script.mq46 скач.

#2281


Еще раз всем добрый день.
Попробовав свои силы, пришел к решению, что нужно попрактиковаться на чем-то попроще, чем советник. Хотя с "подхватом" ордеров справился. Спасибо за советы и моральную поддержку.
Решил написать простенький скрипт, который открывал бы ордер с рынка на продажу, выставлял стоп за ближайший минимум и профит в 4 раза больше стопа.

Но что-то не так. Ордер открывается, в нужную сторону, даже СЛ и ТП ставятся... но слишком далеко. Боюсь, что я так и не понял, как правильно выставлять, а точнее логически прописывать установку, стопов. Или что-то еще не так?

Скрипт во вложении.
Заранее спасибо за помощь.



Ну начнём с того,что
SL=NormalizeDouble(Bid-NL*Point, Digits); //Вычисляем СЛ
TP=NormalizeDouble(Bid+(NL*Point)*x, Digits);
NL не надо умножать на Point,это и так цена , не целое число(3;5;10).
Во-вторых .А чему равно NL???
Надо примерно так:

double L = 1000000; //Стоплосс для БАЙ
double L1 = 0; //Стоплосс для СЕЛЛ

for(int i = 1; i {
if(iLow(Symbol(),0,i) }
for(int i = 1; i {
if(iHigh(Symbol(),0,i) > L1) L1 = iHigh(Symbol(),0,i);
}
В третьих надо найти численное значение SL.
Для этого :

int Sl = (int) ((Цена открытия - полученное значение Стоплосса)/Point);

И вот теперь :

TP=NormalizeDouble(Цена открытия+(Sl*x)*Point, Digits);

Вот как-то так!!!
#2282


...
Вот как-то так!!!



Другими словами, лучше сначала открыть ордер с нулевыми СЛ и ТП, а уже следующим тиком менять их на нужные значения... Спасибо.
#2283
Dron15 почитал по-быстрому код Вашего бота. Вам придётся его переписывать.
Домашнее задание:
1. подготовить в текстовом виде общий алгоритм, без уточнений.
2. в ф-ции OnTick() не должно быть циклов (такое вот задание)
3. сбор сведений о последнем ордере (тип, лот, цена) в одной процедуре - запись в глобальные переменные
4. Вызов ф-ции CountTredes() - один раз! за проход (сохраняйте в переменную и потом используйте)
5. Поиск точки входа 1 раз на открытии бара, а не на каждом тике.
Пока достаточно.
#2284


Dron15 почитал по-быстрому код Вашего бота. Вам придётся его переписывать.
Домашнее задание:
1. подготовить в текстовом виде общий алгоритм, без уточнений.
2. в ф-ции OnTick() не должно быть циклов (такое вот задание)
3. сбор сведений о последнем ордере (тип, лот, цена) в одной процедуре - запись в глобальные переменные
4. Вызов ф-ции CountTredes() - один раз! за проход (сохраняйте в переменную и потом используйте)
5. Поиск точки входа 1 раз на открытии бара, а не на каждом тике.
Пока достаточно.



Хорошо спасибо, обязательно сделаю. Единственный вопрос доделали мы трал или нет ?
#2285

Хорошо спасибо, обязательно сделаю. Единственный вопрос доделали мы трал или нет ?

Не совсем - он запускается криво, а чтоб всё ровно - надо домашку сделать.
#2286

0ll Первый пункт написал.

ДЗ.пунк1.txt4 скач.

#2287

Здравствуйте! Друзья, подскажите, кто знает, как правильно написать код, чтоб советник начинал работу с открытия бара и закрывал открытые позиции перед закрытием бара? (прилагаю часть кода, для примера: открываем покупку на пробитии дневного максимума, а закрыть позицию нужно перед закрытием свечи, тоже самое и на продажу: если текущая свеча пробивает минимум предыдущей свечи)

G.Day.mq49 скач.

#2288

Еще раз добрый день всем. И опять я со своим скриптом :)

Вроде переписал, используя советы тов. Konstebl. Но возник другой вопрос: как правильно вытянуть тикет из уже открытого ордера? Моя попытка ордер открывает, но при выставлении стопов выдает: "2015.06.24 15:38:25.694 Test_Script BRN,M5: invalid ticket for OrderModify function" и "2015.06.24 15:38:25.694 Test_Script BRN,M5: invalid takeprofit for OrderModify function" вот в таком порядке. Я правильно понимаю, что я как-то некорректно передаю тикет от функции OrderSelect() функции OrderModify()? Подскажите пожалуйста, где я ошибся.
Заранее спасибо, текст скрипта во вложении.

Test_Script.txt4 скач.

#2289
Sany2912 Нужно следить за изменением времени открытия бара. Если время изменилось - значит новый бар. Например:
static datetime dd;
if (dd != iTime(NULL, PERIOD_D1, 0)) //новый бар!
{
max = iHigh(Symbol(), PERIOD_D1, 1);
min = iLow(Symbol(), PERIOD_D1, 1);
}
Крайне не советую использовать функции типа iTime(NULL, PERIOD_D1, 0) (т.е. брать данные с другого ТФ) код при 1 запуске может выдавать неадекватные значения. Если есть возможность - используйте текущий ТФ и функции типа Time[0]

Dron15 пришлось переделать - сова не умеет ждать и работает практически в цикле. Вот пример алгоритма:
1. Проверяем нет ли открытых ордеров в рынке. Если ДА: далее, если НЕТ: п.2.
1.1. Проверяем дистанцию от ордера до цены. Если > xx пп.: п.3, если менее: далее
1.2. если дистанция менее - уу пп.: п.4. если более - выход
2. Проверка условий на вход. Если ДА - далее, если НЕТ - выход.
2.1. Входим.
3. Профит. Ставим СЛ и Трал.
4. Усреднение. Проверка условий. если ДА - далее, если нет - выход.
4.1. Вычисляем лот и открываем усредняющий ордер.
#2290


Еще раз добрый день всем. И опять я со своим скриптом :)

Вроде переписал, используя советы тов. Konstebl. Но возник другой вопрос: как правильно вытянуть тикет из уже открытого ордера? Моя попытка ордер открывает, но при выставлении стопов выдает: "2015.06.24 15:38:25.694 Test_Script BRN,M5: invalid ticket for OrderModify function" и "2015.06.24 15:38:25.694 Test_Script BRN,M5: invalid takeprofit for OrderModify function" вот в таком порядке. Я правильно понимаю, что я как-то некорректно передаю тикет от функции OrderSelect() функции OrderModify()? Подскажите пожалуйста, где я ошибся.
Заранее спасибо, текст скрипта во вложении.



for(int i=1;i if(iLow(Symbol(),0,i)
for(int y=0;y {
if(OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
{
if( (OrderMagicNumber()==magic) && (OrderSymbol()==Symbol()) )
{pos=OrderTicket(); OP=OrderOpenPrice();}
}

SL=MathRound(OP-L/Point); ПЕРВАЯ ОШИБКА!!!

OrderModify( pos,OrderOpenPrice(),NormalizeDouble(Bid-SL*Point,Digits),NormalizeDouble(Bid+(SL*x)*Point,Digits),0 );
}
}

1). Вы пытаетесь из цены открытия (допустим 0,9.....) вычесть 1000000 ну или какое-то другое целое число!!!
Надо хотя-бы поставить (). SL=MathRound((OP-L)/Point);
for(int y=0;y {
if(OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
{
if( (OrderMagicNumber()==magic) && (OrderSymbol()==Symbol()) )
{
if(OrderType == OP_BUY)
{
pos=OrderTicket();
OP=OrderOpenPrice();
SL=MathRound((OP-L)/Point);
OrderModify( pos,OrderOpenPrice(),NormalizeDouble(Bid-SL*Point,Digits),NormalizeDouble(Bid+(SL*x)*Point,Digits),0 );
}
}
}
Попробуйте так.

Изменено 24 июня, 2015 пользователем Konstebl

#2291


Sany2912 Нужно следить за изменением времени открытия бара. Если время изменилось - значит новый бар. Например:
static datetime dd;
if (dd != iTime(NULL, PERIOD_D1, 0)) //новый бар!
{
max = iHigh(Symbol(), PERIOD_D1, 1);
min = iLow(Symbol(), PERIOD_D1, 1);
}
Крайне не советую использовать функции типа iTime(NULL, PERIOD_D1, 0) (т.е. брать данные с другого ТФ) код при 1 запуске может выдавать неадекватные значения. Если есть возможность - используйте текущий ТФ и функции типа Time[0]

Спасибо за помощь! Только это не работает!!! я уже так делал... Проблема в том, что после закрытия позиции, в данном случае в 23.55, он продолжает открывать сделки на каждом тике и в 23.56 и в 23.57 и т.д. Этого не должно быть... Следующий анализ ситуации должен происходить с открытия следующего бара.
Может быть есть еще какиенибудь варианты???

#2292
Sany2912 что именно не работает? - я-ж только намекнул как определить приход нового бара, а как этим пользоваться это Ваша задача.
Нужно на листочке расписать алгоритм работы совы, где, какие проверки делать и т.д. Например:
1. Если новый день
1.1. Определяем уровни мах/мин предыдущего
1.2. Вычисляем время окончания работы
1.3. флаг работы = тру.
2. Если цена на уровне, флаг работы == тру и сделок нет - открываемся, иначе выход
3. если время окончания - закрываем ордера, флаг работы = фалсе.

Изменено 24 июня, 2015 пользователем 0ll

#2293


...
Попробуйте так.



Спасибо, всё заработало. Свои ошибки понял. Надеюсь, не сильно всех обеспокоил.
#2294


Sany2912 что именно не работает? - я-ж только намекнул как определить приход нового бара, а как этим пользоваться это Ваша задача.
Нужно на листочке расписать алгоритм работы совы, где, какие проверки делать и т.д. Например:
1. Если новый день
1.1. Определяем уровни мах/мин предыдущего
1.2. Вычисляем время окончания работы
1.3. флаг работы = тру.
2. Если цена на уровне, флаг работы == тру и сделок нет - открываемся, иначе выход
3. если время окончания - закрываем ордера, флаг работы = фалсе.



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

G.Day.mq48 скач.

#2295
Sany2912 попробуй мой вариант. я не запускал, но думаю работать будет.

G.Day.mq49 скач.

#2296


Sany2912 попробуй мой вариант. я не запускал, но думаю работать будет.



Нееет, не работает!! Я о чем и говорю: вроде бы все правильно написано, а не работает... прилагаю скрин.

Рисунок1.jpg
Рисунок2.jpg

Изменено 25 июня, 2015 пользователем Sany2912

#2298

Oll
5. Поиск точки входа 1 раз на открытии бара, а не на каждом тике.

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

#2299


Oll
5. Поиск точки входа 1 раз на открытии бара, а не на каждом тике.

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



Используйте отложенные ордера .БАЙСТОП и СЕЛЛСТОП!
#2300



Oll
5. Поиск точки входа 1 раз на открытии бара, а не на каждом тике.

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



Используйте отложенные ордера .БАЙСТОП и СЕЛЛСТОП!


А если я поставлю отложку и цена развернется и не зацепит ? я имею введу первый ордер. Или вы имели введу первый с рынка а следующие отложками ?

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

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