Перейти к содержанию

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


Рекомендуемые сообщения

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

Подскажите по 6 уроку, написание скриптов. С первым заданием из ДЗ не могу разобраться. Нужно написать скрипт, который будет выставлять защитные стоп ордера к уже имеющимся. Вроде по логике все правильно в коде, но почему то на графике ни чего не происходит. Файл скрипта прилагаю.

StopOrderProtection.mq4

Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано


Подскажите по 6 уроку, написание скриптов. С первым заданием из ДЗ не могу разобраться. Нужно написать скрипт, который будет выставлять защитные стоп ордера к уже имеющимся. Вроде по логике все правильно в коде, но почему то на графике ни чего не происходит. Файл скрипта прилагаю.



Приветствую!

1-я ошибка тут:
for(int i=OrdersTotal()-1; i


Правильно будет:
for(int i=OrdersTotal()-1; i>=0; i--)



  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

1-я ошибка тут:
Код: [Выделить]
for(int i=OrdersTotal()-1; i
Правильно будет:
for(int i=OrdersTotal()-1; i>=0; i--)



Спасибо. Теперь все работает. Я почему-то рассуждал, что цикл будет продолжаться пока i не станет меньше либо равно нулю.
Ссылка на сообщение
Поделиться на другие сайты

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

Странно, вроде все нормально работать должно :d

Изменено пользователем Silentspec
Ссылка на сообщение
Поделиться на другие сайты

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

Приветствую!


Подскажите,чего все ордера у файл не пишутся
http://joxi.ru/V2VgoO6TnB4bAv
Пробовал код с
sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s=OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp;
FileWrite(h,s);
вынести за Ордертайп,та же фигня.

void OnTick()
{
//--- Открываем файл
int h=FileOpen("log.txt",FILE_READ|FILE_WRITE|FILE_TXT);
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{

if(OrderType()==OP_BUY)
{
type=0;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();

sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s=OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp;
FileWrite(h,s);
}

if(OrderType()==OP_SELL)
{
type=1;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();

sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s=OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp;
FileWrite(h,s);
}
if(OrderType()==OP_BUYLIMIT)
{
type=2;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();

sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s=OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp;
FileWrite(h,s);
}
if(OrderType()==OP_SELLLIMIT)
{
type=3;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();

sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s=OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp;
FileWrite(h,s);
}
if(OrderType()==OP_BUYSTOP)
{
type=4;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();

sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s=OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp;
FileWrite(h,s);
}
if(OrderType()==OP_SELLSTOP)
{
type=5;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();

sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s=OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp;
FileWrite(h,s);
}

RefreshRates();


}//OrderSelect
FileClose(h);
}//
Ссылка на сообщение
Поделиться на другие сайты

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

Разбираюсь с советником, при компиляции пишет ошибку 'AutoTimeSettings should be (fal…' - parameter passed as reference, variable expected делает ссылку на эту строку

if (AutoTimeSettings) {
MessageBoxA(0, "AutoTimeSettings should be (false) at the test mode. Using ManualGMT_Offset", "Error", 0);

в чем может быть дело?

Ссылка на сообщение
Поделиться на другие сайты

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

Уважаемые программисты! Возможно глупый вопрос, но не могу сообразить. Собираю советник по индикатору и двум таймфреймам Н1 и М15, на Н1 есть сигнал и пока он держится на М15 может быть несколько потенциальных входов. Подскажите как прописать условие чтобы брался только первый или один?

Ссылка на сообщение
Поделиться на другие сайты

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

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

//Запись
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- Открываем файл
int h=FileOpen("log.txt",FILE_READ|FILE_WRITE|FILE_TXT);
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{

if(OrderType()==OP_BUY)
{
type=0;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();

sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s=OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp;
FileWrite(h,s);
}

if(OrderType()==OP_SELL)
{
type=1;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();

sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s=OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp;
FileWrite(h,s);
}
if(OrderType()==OP_BUYLIMIT)
{
type=2;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();

sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s=OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp;
FileWrite(h,s);
}
if(OrderType()==OP_SELLLIMIT)
{
type=3;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();

sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s=OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp;
FileWrite(h,s);
}
if(OrderType()==OP_BUYSTOP)
{
type=4;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();

sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s=OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp;
FileWrite(h,s);
}
if(OrderType()==OP_SELLSTOP)
{
type=5;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();

sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s=OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp;
FileWrite(h,s);
}

RefreshRates();


}//OrderSelect
FileClose(h);
}//

Import_trade.mq4
Export_trade.mq4

Ссылка на сообщение
Поделиться на другие сайты

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


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




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

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

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


А как правильно?
Ссылка на сообщение
Поделиться на другие сайты

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


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


А как правильно?


Может просто каждый ордер отдельно записывать в отдельный файл, я же не знаю для чего и каквы используете эти данные. Толковые ребята найдутся которые распишут как нужно.
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте, уважаемый Сергей Ака! В MQL eсть функция GetTickCount, которая возвращает число msec, прошедших с момента запуска системы. Скажите пожалуйста, возможно-ли с помощью этой функции определить время между тиками т.е. GetTickCount_2 - GetTickCount_1 = t(msec), и, как это правильно прописать в коде MQL. И ещё, пожалуйста, как в условном операторе прописать направление движения цены (вверх или вниз). Спасибо!

Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

FileWrite(h,s);


FileWriteString(h, s + "\r\n") вам в помощь.

Но лучше так
s += OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp + "\r\n";
FileWrite(h,s);
...
}//OrderSelect
FileWrite(h,s);
FileClose(h); Изменено пользователем SilverKZ
Ссылка на сообщение
Поделиться на другие сайты

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

FileWriteString(h, s + "\r\n") вам в помощь.


Куда конкретно записать FileWriteString(h, s + "\r\n")


void OnTick()
{
//--- Открываем файл
int h=FileOpen("log.txt",FILE_READ|FILE_WRITE|FILE_TXT);
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{

if(OrderType()==OP_BUY)
{
type=0;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();

sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s += OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp + "\r\n";
FileWriteString(h,s);
}

if(OrderType()==OP_SELL)
{
type=1;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();

sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s += OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp + "\r\n";
FileWriteString(h,s);
}
if(OrderType()==OP_BUYLIMIT)
{
type=2;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();

sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s += OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp + "\r\n";
FileWriteString(h,s);
}
if(OrderType()==OP_SELLLIMIT)
{
type=3;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();

sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s += OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp + "\r\n";
FileWriteString(h,s);
}
if(OrderType()==OP_BUYSTOP)
{
type=4;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();

sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s += OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp + "\r\n";
FileWriteString(h,s);
}
if(OrderType()==OP_SELLSTOP)
{
type=5;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();

sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s += OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp + "\r\n";
FileWriteString(h,s);
}

RefreshRates();


}//OrderSelect
FileClose(h);
}//

Добавлено: 13-01-2017 14:07:47


FileWrite(h,s);


FileWriteString(h, s + "\r\n") вам в помощь.

Но лучше так
s += OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp + "\r\n";
FileWrite(h,s);
...
}//OrderSelect
FileWrite(h,s);
FileClose(h);

У меня в файл с новой строки пишеться,но вместо трех сделок,пишеться раз в 100 больше.
http://joxi.ru/n2YVoxLUKdkoA6
вот исходник
http://joxi.ru/krD0oMginOGWrp
Изменено пользователем scherbakovss
Ссылка на сообщение
Поделиться на другие сайты

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

Так

Спойлер

Цитата

//Запись
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- Открываем файл
int h=FileOpen("log.txt",FILE_READ|FILE_WRITE|FILE_TXT);
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{

if(OrderType()==OP_BUY)
{
type=0;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();

sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s+=OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp + "\r\n";
}

if(OrderType()==OP_SELL)
{
type=1;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();

sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s+=OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp + "\r\n";
}
if(OrderType()==OP_BUYLIMIT)
{
type=2;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();

sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s+=OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp + "\r\n";
}
if(OrderType()==OP_SELLLIMIT)
{
type=3;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();

sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s+=OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp + "\r\n";
}
if(OrderType()==OP_BUYSTOP)
{
type=4;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();

sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s+=OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp + "\r\n";
}
if(OrderType()==OP_SELLSTOP)
{
type=5;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();

sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s+=OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp + "\r\n";
}

RefreshRates();


}//OrderSelect
FileWrite(h,s);
FileClose(h);
}//

Ссылка на сообщение
Поделиться на другие сайты

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

}//OrderSelect
FileWrite(h,s);


Наверное
FileWriteString(h,s); //вместо FileWrite(h,s);

Добавлено: 13-01-2017 14:30:05

Так
(click to show/hide)


Все равно в файл пишет 100 дубликатов вместо 3х сделок.
Ссылка на сообщение
Поделиться на другие сайты

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


scherbakovss, вам нужен советник или скрипт?


Советник,так,что бы я его видел.

Добавлено: 13-01-2017 18:54:22


scherbakovss, вам нужен советник или скрипт?


в терминале было три сделки открыто,а он в текстовый файл 15895 записей сделал
Ссылка на сообщение
Поделиться на другие сайты

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

OK, сделал рефакторинг кода Export и поправил чуть, импорт сами сделайте.


А как для отложенного ордера вернуть цену,по которой он установлен?
OrderOpenPrice() это же для рыночного ордера?
Ссылка на сообщение
Поделиться на другие сайты

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

А как для отложенного ордера вернуть цену,по которой он установлен?


Так же, как и для рыночного.
Ссылка на сообщение
Поделиться на другие сайты

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

Вы можете открыть сокет и вторым терминалом к нему подключиться ( можно даже сделать терминалы на разных компьютерах ).
Так же вы можете использовать расширяемую память, но это от вас потребует синхронизации процессов для работы с ней ( mutex или semaphore ).

Ссылка на сообщение
Поделиться на другие сайты

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

).


А можно по человечески ответить?
Ваши ссылки на википедию,в которой поверхностные статьи.Как конкретно подключиться к сокету,приведите пример на mql4 ?
Ссылка на сообщение
Поделиться на другие сайты

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


А можно по человечески ответить?

Имхо, не будет примеров на мкл... Это сложная тема и стоит немалых денег.
Если скорость передачи значений между терминалами не критична, то передавать можно через файл в общей папке терминалов - эти примеры видел в сети.
Ссылка на сообщение
Поделиться на другие сайты

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

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...