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

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

#4101

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

StopOrderProtection.mq44 скач.

Автор#4102


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



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

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


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



#4103

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



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

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

Изменено 11 января, 2017 пользователем Silentspec

#4105

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


Подскажите,чего все ордера у файл не пишутся
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);
}//
#4106

Разбираюсь с советником, при компиляции пишет ошибку '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);

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

#4107

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

#4108

Подскажите на примере как правильно все открытые сделки в мт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.mq45 скач.
Export_trade.mq44 скач.

#4109


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




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

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


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


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


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


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

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

#4113

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

#4114

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);

Изменено 13 января, 2017 пользователем SilverKZ

#4115

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

#4116

Так

Спойлер

Цитата

//Запись
//+------------------------------------------------------------------+
//| 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);
}//

#4117

}//OrderSelect
FileWrite(h,s);


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

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

Так
(click to show/hide)


Все равно в файл пишет 100 дубликатов вместо 3х сделок.
#4118
scherbakovss, вам нужен советник или скрипт?
#4119


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


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

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


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


в терминале было три сделки открыто,а он в текстовый файл 15895 записей сделал
#4120

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

Export_trade.mq46 скач.

#4121

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


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

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


Так же, как и для рыночного.
#4123

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

#4124

).


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


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

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

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

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