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

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

#4076

Ок, спасибо за наводку. Мне, правда, уже на другом ресурсе сделали, но на будущее учту.

#4077

Для каждого паттерна/пары/таймфрейма отдельно. Я вроде бы в статье даже прикладывал диаграммы соотношений по парам для каждого тф каждого паттерна.

#4078

Подскажите с одним моментом:

пытаюсь ставить отложенники в советнике, которые будут устанавливаться по сигналам и автоматически удаляться в определенное время при их не срабатывании, к примеру, в 15:00.

Пишу

Цитата

datetime Expiration = StrToTime("15:00");
OrderSend(NULL,OP_SELLSTOP,0.3,min_price-0.0006,3,SL,TP,"",123,Expiration,Green);



но это работает только первый день на истории в тестере, а в остальные просто не выставляется ордер.

В различных мануалах находил, что если указывать только время без даты, то это будет выполняться на текущий день. Но что-то не работает на остальные дни.
Что я упускаю, подскажите?
#4079


Подскажите с одним моментом:

пытаюсь ставить отложенники в советнике, которые будут устанавливаться по сигналам и автоматически удаляться в определенное время при их не срабатывании, к примеру, в 15:00.

Пишу

Цитата

datetime Expiration = StrToTime("15:00");
OrderSend(NULL,OP_SELLSTOP,0.3,min_price-0.0006,3,SL,TP,"",123,Expiration,Green);



В журнале какую ошибку пишет ?

но это работает только первый день на истории в тестере, а в остальные просто не выставляется ордер.

В различных мануалах находил, что если указывать только время без даты, то это будет выполняться на текущий день. Но что-то не работает на остальные дни.
Что я упускаю, подскажите?
#4080

Выдает ошибку 4051, т.е.
ERR_INVALID_FUNCTION_PARAMVALUE - Недопустимое значение параметра функции

только, что ему не нравится не пойму. Если экспирацию ставлю 0, то работает без проблем. Получается в ней дело.

#4081

Догадка у меня такая - поскольку Вы не прописываете число в дату, то число берется текущее.
В результате если по времени ордер пытается установится после 15:00 текущего числа, мы получаем ситуацию, что дата истечения отложки, которую вы пытаетесь прописать уже прошла. Думаю по этому поводу и ругается.

#4082

Есть два мт4 от одного брокера,установленные в разные папки.Задача передать значение переменой с терминала1,а с терминала2 ее считать и вывести алертом. Помогите?

Я думал,через глобальные переменные,но они доступны только внутри терминала1,в котором и создаются.

//---Запись глобальной переменной
string name1="SL";
string name2="IN";
string name3="TP1";
string name4="TP2";
double value1=1.26224;
double value2=1.26092;
double value3=1.25960;
double value4=1.25828;
datetime dt1= GlobalVariableSet( name1,value1 );
datetime dt2= GlobalVariableSet( name2,value2 );
datetime dt3= GlobalVariableSet( name3,value3 );
datetime dt4= GlobalVariableSet( name4,value4 );
//---Чтение глобальной переменой
double SL= GlobalVariableGet(name1);
Alert(SL);
//Возвращает общее количество глобальных переменных
Alert(GlobalVariablesTotal());

#4083

Решил вместо экспирации применить проверку на наличие отложенников в 15:00 и их удаление. По крайней мере мне проще реализовать))

У меня другой вопрос еще есть. Никак не уловлю принцип OrderModify.
Причем модификацию хочу провести только для открытых ордеров (OP_SELL и OP_BUY), чтобы переводить в безубыток по достижению n-го числа пунктов.

Структура ее выглядит так:

Цитата

bool OrderModify(
int ticket, // номер ордера
double price, // цена открытия
double stoploss, // stop loss
double takeprofit, // take profit
datetime expiration, // время истечения ордера
color arrow_color // цвет
);



Цену открытия нужно менять только для отложенников. Для открытого получается нужно писать просто ноль?

К примеру я вошел по PriceIn:
Цитата

OrderSend(NULL, OP_BUY, 0.3, PriceIn, 3, SL, 0, "", 12345, 0, Green);



Тогда, чтобы перевести в безубыток нужно следующую команду прописать:
Цитата

OrderModify(OrderTicket(), 0, PriceIn, 0, 0, Green);



Верно понимаю?
#4084

OrderOpenPrice(), почему ноль то?

#4085
Спойлер


Решил вместо экспирации применить проверку на наличие отложенников в 15:00 и их удаление. По крайней мере мне проще реализовать))

У меня другой вопрос еще есть. Никак не уловлю принцип OrderModify.
Причем модификацию хочу провести только для открытых ордеров (OP_SELL и OP_BUY), чтобы переводить в безубыток по достижению n-го числа пунктов.

Структура ее выглядит так:

Цитата

bool OrderModify(
int ticket, // номер ордера
double price, // цена открытия
double stoploss, // stop loss
double takeprofit, // take profit
datetime expiration, // время истечения ордера
color arrow_color // цвет
);



Цену открытия нужно менять только для отложенников. Для открытого получается нужно писать просто ноль?

К примеру я вошел по PriceIn:
Цитата

OrderSend(NULL, OP_BUY, 0.3, PriceIn, 3, SL, 0, "", 12345, 0, Green);



Тогда, чтобы перевести в безубыток нужно следующую команду прописать:
Цитата

OrderModify(OrderTicket(), 0, PriceIn, 0, 0, Green);



Верно понимаю?


Не много не понял - "модификацию хочу провести только для открытых ордеров (OP_SELL и OP_BUY)" и чуть ниже фраза "Цену открытия нужно менять только для отложенников." Противоречие какое-то.
OrderModify изменяет параметры уже существующего ордера, чтобы перевести в бу открытый уже ордер
просто в цену стоп-лоса ордера вставляем цену открытия ордера
OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(),OrderTakeProfit(), OrderExpiration(), Green);
при этом цену открытия ордера мы уже изменить не можем - там должна стоять цена, по которой ордер уже открылся. Переменные лучше не использовать - или в такие переменные надо присваивать фактическую цену открытия, так как цена открытия рыночного ордера и цена открытия отложенного ордера часто разнятся из-за проскальзываний.
#4086
Цитата


Не много не понял - "модификацию хочу провести только для открытых ордеров (OP_SELL и OP_BUY)" и чуть ниже фраза "Цену открытия нужно менять только для отложенников." Противоречие какое-то.



Это размышление вслух идет.

Цитата


OrderModify изменяет параметры уже существующего ордера, чтобы перевести в бу открытый уже ордер
просто в цену стоп-лоса ордера вставляем цену открытия ордера
OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(),OrderTakeProfit(), OrderExpiration(), Green);



Спасибо, попрактикую!

Добавлено: 07-01-2017 18:31:24

Переводить в безубыток получается.

Использую такой код:
Цитата

if (OrderSelect (i, SELECT_BY_POS, MODE_TRADES) && OrderType() == OP_SELL)
OrderModify (OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), 0, 0, clrRed);



Однако когда пытаюсь ставить условие, по которому перевод в безубыток будет происходить, сразу возникает ошибка 1.

К примеру: пытаюсь условие до простого доводить. Цена от входа на продажу 1.4210 до конца дня проходит до 1.4155.

Пишу условие:
Цитата


if (Bid if (OrderSelect (i, SELECT_BY_POS, MODE_TRADES) && OrderType() == OP_SELL)
OrderModify (OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), 0, 0, clrRed);



Сразу возникает ошибка 1.

Пытаюсь отдельно проверять это условие через Print, всё работает - но модификация выводит ошибку.

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

Добавлено: 08-01-2017 09:58:51

Заработало!

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

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

#4087

Будьте добры, подскажите где я ошибаюсь (речь о домашнем задании к последнему уроку). Теперь у меня появилось деление на ноль. Наверное опять где-то опечатка в программе, но не могу найти, странно то, что на некоторых парах все замечательно. Спасибо

123.jpg
PriceActionPatterns_d.mq421 скач.

#4088


Будьте добры, подскажите где я ошибаюсь (речь о домашнем задании к последнему уроку). Теперь у меня появилось деление на ноль. Наверное опять где-то опечатка в программе, но не могу найти, странно то, что на некоторых парах все замечательно. Спасибо



Это не опечатка, там действительно нужно поправить код везде где при расчетах свечей производится деление, если в котировках свеча имеет Hi и Low по одной цене например, то разница будет 0 и соответственно далее на него деление - это и есть ошибка.
#4089

Точно, косяк в сове. Как то не подумал я, что на н1 или даже на д1 может быть свеча с равными хаем и лоем. Кстати, может ли? Думаю, такое маловероятно. А вот косячок в котировках вполне может быть. Кстати, надо бы свои котиры проверить, есть ли такие свечи...

#4090

Подскажите пожалуйста как советнику объяснить что случился тейкпрофит или стоплосс? Нужно после такого события выдать определённую команду (например удалить или модифицировать отложку), а от чего оттолкнуться никак не соображу

#4091


Точно, косяк в сове. Как то не подумал я, что на н1 или даже на д1 может быть свеча с равными хаем и лоем. Кстати, может ли? Думаю, такое маловероятно. А вот косячок в котировках вполне может быть. Кстати, надо бы свои котиры проверить, есть ли такие свечи...


Дмитрий, было бы замечательно, если бы вы подсказали как это красиво подправить. Хочется доделать задание)) Спасибо.
rva7171 уважение вам, за быстрый и точный комментарий.
#4092



Точно, косяк в сове. Как то не подумал я, что на н1 или даже на д1 может быть свеча с равными хаем и лоем. Кстати, может ли? Думаю, такое маловероятно. А вот косячок в котировках вполне может быть. Кстати, надо бы свои котиры проверить, есть ли такие свечи...


Дмитрий, было бы замечательно, если бы вы подсказали как это красиво подправить. Хочется доделать задание)) Спасибо.
rva7171 уважение вам, за быстрый и точный комментарий.



Вот так как то и аналогично везде где деление

//+------------------------------------------------------------------+
int Rails()
{
double Close1=iClose(_Symbol,_Period,1);
double Open1=iOpen(_Symbol,_Period,1);
double Low1=iLow(_Symbol,_Period,1);
double High1=iHigh(_Symbol,_Period,1);
double Close2=iClose(_Symbol,_Period,2);
double Open2=iOpen(_Symbol,_Period,2);
double Low2=iLow(_Symbol,_Period,2);
double High2=iHigh(_Symbol,_Period,2);
HideTestIndicators(true);
double ATR=iATR(_Symbol,_Period,14,1);
HideTestIndicators(false);
double Close3=iClose(_Symbol,_Period,3);
double Open3=iOpen(_Symbol,_Period,3);
double CandleBody1=1;
double CandleSize1=1;
double CandleSize2=1;
if(MathAbs(Close1-Open1)!=0)CandleBody1=MathAbs(Close1-Open1);
if(High1-Low1!=0)CandleSize1=High1-Low1;
if(High2-Low2!=0)CandleSize2=High2-Low2;

if(MathAbs(Close1-Open1)/CandleSize1>0.7 && MathAbs(Close2-Open2)/CandleSize2>0.7 && High1-Low1>0.7*ATR && High2-Low2>0.7*ATR &&
MathAbs(Close2-Open2)/CandleBody1>=0.7 && MathAbs(Close2-Open2)/CandleBody1 {
if(Close1Open2&&Close3>Open3) return(-1);
if(Close1>Open1&&Close2 }
return(0);
}
//+------------------------------------------------------------------+
#4093

Здравствуйте, я хотел задать вопрос по 3му уроку, на нем писали советника по внешнему индикатору, я немного изменил условия сделки и получилось что на продажу все работает хорошо, а вот на покупку ордер не тралится. Подскажите пожалуйста как поправить ситуацию чтоб советник работал полноценно

ТМА_за_переделы.mq43 скач.

#4094

Помогите доделать запись всех сделок у файл лежащий в песочнице
1)Он запрашивает только первую сделку
2)только рыночный ордер
Нужно что бы все открытые сделки(рыночные и лимитные ордера) записывались у файл
,а если какая то сделка закрылась то он должна из файла исчезнуть.
Мне для билда 1010.

[glow=red,2,300]
//+------------------------------------------------------------------+
//| Export_trade.mq4 |
//| Copyright 2016, AM2 |

//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link "http://www.forexsystems.biz"
#property version "1.00"
#property strict

int type=0;
double lot=0,sl=0,tp=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---

//---
return(INIT_SUCCEEDED);
}


//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
Comment("");
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void Log(string s="")
{
//--- Открываем файл
int h=FileOpen("log.txt",FILE_READ|FILE_WRITE|FILE_TXT);
FileWrite(h,s);
FileClose(h); // закрываем файл
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY)
{
type=0;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();
}
if(OrderType()==OP_SELL)
{
type=0;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();
}

}//OrderSymbol
sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
Log(Symbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp);
RefreshRates();
}//OrderSelect
}//


Comment("\n Order Type: ",type,
"\n Order Lots: ",lot,
"\n StopLoss: ",sl,
"\n TakeProfit: ",tp);
}
//+------------------------------------------------------------------+
[/glow]


#4095

Ты открываешь файл, записываешь сделку первую туда и тут же файл закрываешь.
Убери функцию void Log(string s="")
После
void OnTick()
{
поставь
int h=FileOpen("log.txt",FILE_READ|FILE_WRITE|FILE_TXT);
Затем вместо
Log(Symbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp);
ставь FileWrite(h,s); и записывай что тебе нужно
а FileClose(h); // закрываем файл уже в самый конец, перед последней }

#4096


Ты открываешь файл, записываешь сделку первую туда и тут же файл закрываешь.
Убери функцию void Log(string s="")
После
void OnTick()
{
поставь
int h=FileOpen("log.txt",FILE_READ|FILE_WRITE|FILE_TXT);
Затем вместо
Log(Symbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp);
ставь FileWrite(h,s); и записывай что тебе нужно
а FileClose(h); // закрываем файл уже в самый конец, перед последней }



НЕ ПОМОГАЕТ.
http://joxi.ru/E2p9xq3hkaKKAY
//+------------------------------------------------------------------+
//| Export.mq4 |
//| Copyright 2016, AM2 |
//| http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link "http://www.forexsystems.biz"
#property version "1.00"
#property strict

int type=0;
double lot=0,sl=0,tp=0;
string s="";
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---

//---
return(INIT_SUCCEEDED);
}


//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
Comment("");
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void Log(string s="")
{


}
//+------------------------------------------------------------------+
//| 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(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY)
{
type=0;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();
}
if(OrderType()==OP_SELL)
{
type=1;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();
}

}//OrderSymbol
sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s=Symbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp;
FileWrite(h,s);
RefreshRates();
}//OrderSelect
FileClose(h);
}//


Comment("\n Order Type: ",type,
"\n Order Lots: ",lot,
"\n StopLoss: ",sl,
"\n TakeProfit: ",tp);
}
//+------------------------------------------------------------------+
#4097

Не, сл, тп, s и filewrite нужно до закрывающей скобки поставить, той, где коммент с ордерсимволом

#4098

Не, сл, тп, s и filewrite нужно до закрывающей скобки поставить, той, где коммент с ордерсимволом


Сделал пишет в файл njkmrj gjcktly.. cltkre?z nfr gjybvf. ne yf rjnjhjq dbcbn rjgbhjdobr
http://joxi.ru/8An9nqahvyok2O

Добавлено: 10-01-2017 20:17:09

Не, сл, тп, s и filewrite нужно до закрывающей скобки поставить, той, где коммент с ордерсимволом



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(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY)
{
type=0;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();
}
if(OrderType()==OP_SELL)
{
type=1;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();
}
sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s=Symbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp;
FileWrite(h,s);
RefreshRates();
}//OrderSymbol

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

Ну, что не так то? Все правильно же работает,верно?

Кстати, ты писал

Цитата

Нужно что бы все открытые сделки(рыночные и лимитные ордера) записывались у файл


А проверку на лимитные и стоповые ордера я не вижу в коде.
if(OrderType()==OP_SELLSTOP, SELLLimit, BUYLIMIT и т.д.

И, кстати, тебе нужно по одной только паре все сделки или по всем?
Наверное по всем, но тогда if(OrderSymbol()==Symbol()) - лишняя проверка.
#4100

Ну, что не так то? Все правильно же работает,верно?


Не работает,убрал проверку на валютную пару,добавил отложенные ордера
http://joxi.ru/Grq9kplhMGqqrz

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

if(OrderType()==OP_SELL)
{
type=1;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();
}
if(OrderType()==OP_BUYLIMIT)
{
type=2;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();
}
if(OrderType()==OP_SELLLIMIT)
{
type=3;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();
}
if(OrderType()==OP_BUYSTOP)
{
type=4;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();
}
if(OrderType()==OP_SELLSTOP)
{
type=5;
lot=OrderLots();
sl=OrderStopLoss();
tp=OrderTakeProfit();
}
sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
s=Symbol()+" "+(string)type+" "+(string)lot+" "+(string)sl+" "+(string)tp;
FileWrite(h,s);
RefreshRates();


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

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

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