Подскажите по 6 уроку, написание скриптов. С первым заданием из ДЗ не могу разобраться. Нужно написать скрипт, который будет выставлять защитные стоп ордера к уже имеющимся. Вроде по логике все правильно в коде, но почему то на графике ни чего не происходит. Файл скрипта прилагаю.
Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
Подскажите по 6 уроку, написание скриптов. С первым заданием из ДЗ не могу разобраться. Нужно написать скрипт, который будет выставлять защитные стоп ордера к уже имеющимся. Вроде по логике все правильно в коде, но почему то на графике ни чего не происходит. Файл скрипта прилагаю.
Приветствую!
1-я ошибка тут:
for(int i=OrdersTotal()-1; i
Правильно будет:
for(int i=OrdersTotal()-1; i>=0; i--)
1-я ошибка тут:
Код: [Выделить]
for(int i=OrdersTotal()-1; i
Правильно будет:
for(int i=OrdersTotal()-1; i>=0; i--)
Спасибо. Теперь все работает. Я почему-то рассуждал, что цикл будет продолжаться пока i не станет меньше либо равно нулю.
Странно, вроде все нормально работать должно :d
Изменено 11 января, 2017 пользователем Silentspec
Приветствую!
Подскажите,чего все ордера у файл не пишутся
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);
}//
Разбираюсь с советником, при компиляции пишет ошибку '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);
в чем может быть дело?
Уважаемые программисты! Возможно глупый вопрос, но не могу сообразить. Собираю советник по индикатору и двум таймфреймам Н1 и М15, на Н1 есть сигнал и пока он держится на М15 может быть несколько потенциальных входов. Подскажите как прописать условие чтобы брался только первый или один?
Подскажите на примере как правильно все открытые сделки в мт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);
}//
Подскажите на примере как правильно все открытые сделки в мт4 записать у файл и прочитать их,бо реально,что не делал пишет только последний ордер и все.А если ордер закрылся то запись о нем не стираеться из файла.
навскидку думаю что ты просто перезаписываешь переменные и остается один последний ордер.
навскидку думаю что ты просто перезаписываешь переменные и остается один последний ордер.
А как правильно?
навскидку думаю что ты просто перезаписываешь переменные и остается один последний ордер.
А как правильно?
Может просто каждый ордер отдельно записывать в отдельный файл, я же не знаю для чего и каквы используете эти данные. Толковые ребята найдутся которые распишут как нужно.
Здравствуйте, уважаемый Сергей Ака! В MQL eсть функция GetTickCount, которая возвращает число msec, прошедших с момента запуска системы. Скажите пожалуйста, возможно-ли с помощью этой функции определить время между тиками т.е. GetTickCount_2 - GetTickCount_1 = t(msec), и, как это правильно прописать в коде MQL. И ещё, пожалуйста, как в условном операторе прописать направление движения цены (вверх или вниз). Спасибо!
Жаль,что в моем вопросе отсутствую специалисты способные помочь по записи и чтению всех типов ордеров в файл с обновлением если ордер закрылся.
FileWrite(h,s);
FileWriteString(h, s + "\r\n") вам в помощь.
Но лучше так
s += OrderSymbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp + "\r\n";
...
}//OrderSelect
FileWrite(h,s);
FileClose(h);
Изменено 13 января, 2017 пользователем SilverKZ
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
Изменено 13 января, 2017 пользователем scherbakovss
Так
Цитата//Запись
//+------------------------------------------------------------------+
//| 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);
}//
}//OrderSelect
FileWrite(h,s);
Наверное
FileWriteString(h,s); //вместо FileWrite(h,s);
Добавлено: 13-01-2017 14:30:05
Так
(click to show/hide)
Все равно в файл пишет 100 дубликатов вместо 3х сделок.
scherbakovss, вам нужен советник или скрипт?
Советник,так,что бы я его видел.
Добавлено: 13-01-2017 18:54:22
scherbakovss, вам нужен советник или скрипт?
в терминале было три сделки открыто,а он в текстовый файл 15895 записей сделал
OK, сделал рефакторинг кода Export и поправил чуть, импорт сами сделайте.
OK, сделал рефакторинг кода Export и поправил чуть, импорт сами сделайте.
А как для отложенного ордера вернуть цену,по которой он установлен?
OrderOpenPrice() это же для рыночного ордера?
А как для отложенного ордера вернуть цену,по которой он установлен?
Так же, как и для рыночного.
Вы можете открыть сокет и вторым терминалом к нему подключиться ( можно даже сделать терминалы на разных компьютерах ).
Так же вы можете использовать расширяемую память, но это от вас потребует синхронизации процессов для работы с ней ( mutex или semaphore ).
).
А можно по человечески ответить?
Ваши ссылки на википедию,в которой поверхностные статьи.Как конкретно подключиться к сокету,приведите пример на mql4 ?
Имхо, не будет примеров на мкл... Это сложная тема и стоит немалых денег.
А можно по человечески ответить?
Если скорость передачи значений между терминалами не критична, то передавать можно через файл в общей папке терминалов - эти примеры видел в сети.
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем