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

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

#2101


20 мая 2013 две сделки, а на графике цена на много выше,мы не могли войти там в сделку. фото приложил)))
Второй момент сделка №1 и №2 закрылась по цене 1,29417 и 1,29864, а хай этого дня вообще не поднимался выше 1,29006. Фото приложил , архив котировок брокера Фибо групп. Понимаю что это всего лишь видеоролик где xbms учит нас программированию,но цены несуществующие :-?


Добавлено: 07-04-2015 17:11:55

Не нарушается ли логика в последовательности действий ???
Если в коде указанны блок продаж Sell , потом блок покупок Buy . Потом блоки закрытия. В фото приведённом постом выше, мы одновременно находились в сделке и Buy и Sell по Евро Доллару.

1. Сделки закрывались не 20 мая - смотрите внимательно!
2. Сделки не одновременно а последовательно - смотрите внимательно на дату и время!
#2102

Всем доброго вечера, уважаемые! :d

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

Нашел вот такой фрагмент кода:

Спойлер

Цитата

Часть кода по модификации лота. Кидаем в любой советник.

Эта часть при описи переменных
extern double Лот = 0.01; // Для установки размера лота
extern double Максимальный_лот = 0.04; // Ограничение по максимально возможному лоту
Эта часть в начале основного кода

// +++++++++++ модификация лота +++ начало ++++++++++++++++++++
//-------------------------------------------------------------
double lot=Лот;

// узнаем лот последнего ордера и его прибыль
int i=1;
double order_history_profit=0;
double order_history_lot=0;

while (i {
OrderSelect (OrdersHistoryTotal()-i,SELECT_BY_POS,MODE_HISTORY);
if (Magicbuy==OrderMagicNumber( ) || Magicsell==OrderMagicNumber( ))
{
if (OrderSymbol() == Symbol())
{
order_history_profit = OrderProfit( );
order_history_lot = OrderLots();
break();
}
}
i++;
}
// увеличим размер лота если последний ордер убыточный
if (order_history_profit // уменьшим размер лота если последний ордер прибыльный
if (order_history_profit > 0) lot=Лот;
// упорядочивание лота при его выходе за пределы нормы

if (lot >= Максимальный_лот ) lot=Лот; // ограничение по количеству модификаций

if (lot if (lot > MarketInfo(Symbol(),MODE_MAXLOT)) lot=MarketInfo(Symbol(),MODE_MAXLOT); // ограничение по максимально допустимому лоту

//------------------------------------------------------------
// +++++++++++ модификация лота +++ конец ++++++++++++++++++++

В функцию "OrderSend" переменная "lot"



При компилировании выдаются ошибки насчет функций Magicbuy и Magicsell в первом условном операторе, а так же ошибка на скобках break();.

Что это может быть? Вообще этот участок кода рабочий? Может кто-то может что то подсказать...

Буду очень признателен, за помощь. >:d
Заранее спасибо большое! :)
#2103

Замените if (Magicbuy==OrderMagicNumber( ) || Magicsell==OrderMagicNumber( )) на if (Magic ==OrderMagicNumber( ) )
break(); на break;
#2104

Добрый день.
0ll,
Заменил в коде, вторая ошибка со скобками исчезла, но первая ошибка остается: 'Magic' - undeclared identifier

Что еще может служить причиной?

#2105
Vanka-Yanka у Вас магик в советнике используется? если да - то это он, если нет, то надо-бы завести...
Если не знаете что такое магик в советнике - гуглите.
#2106
0ll,

Добрый день! :)

Магик используется, но он по-другому в советнике назван, а именно EA_magic равен он 9494, по-моему то.

Заменил именно на такое название и вроде компиляция прошла. Сегодня пока еще не тестировал советник. Вечером займусь.

Спасибо большое Вам! =d>
#2107
0ll, добрый день.

Компиляцию провожу без ошибок, но все равно при тестировании после возникновении СЛ лот не увеличивается - не работают изменения. Возможно проблема с переменными?

Решил все по-порядку расписать, возможно ошибка найдется.

В моем советнике в описи использованы следующие переменные:

Лот - FixLot
Магик - EA_magic

В куске кода для примения Мартина, описано добавление еще двух перепенных в опись -

Цитата

Эта часть при описи переменных
extern double Лот = 0.01; // Для установки размера лота
extern double Максимальный_лот = 0.04; // Ограничение по максимально возможному лоту



Меня смущают вот эти сами переменные, ведь они должны быть скоррелированы с теми, которые уже прописаны в советнике, так ведь? Или я что то не понимаю?
И еще вопрос. Я извиняюсь, что не обладаю достаточными знаниями, возможно вопрос сам по себе будет звучать нелепо, но тем не менее - в какую часть советника вшивать этот кусок кода? Я его вставил сразу после описи переменных, правильно ли это?

Ниже привожу окончательный вариант кода, который прошел компиляцию, но не работает на практике.

Спойлер

Цитата

Часть кода по модификации лота. Кидаем в любой советник.

Эта часть при описи переменных
extern double Лот = 0.01; // Для установки размера лота
extern double Максимальный_лот = 0.04; // Ограничение по максимально возможному лоту
Эта часть в начале основного кода

// +++++++++++ модификация лота +++ начало ++++++++++++++++++++
//-------------------------------------------------------------
double lot=Лот;

// узнаем лот последнего ордера и его прибыль
int i=1;
double order_history_profit=0;
double order_history_lot=0;

while (i {
OrderSelect (OrdersHistoryTotal()-i,SELECT_BY_POS,MODE_HISTORY);
if (EA_magic ==OrderMagicNumber( ) )
{
if (OrderSymbol() == Symbol())
{
order_history_profit = OrderProfit( );
order_history_lot = OrderLots();
break;
}
}
i++;
}
// увеличим размер лота если последний ордер убыточный
if (order_history_profit // уменьшим размер лота если последний ордер прибыльный
if (order_history_profit > 0) lot=Лот;
// упорядочивание лота при его выходе за пределы нормы

if (lot >= Максимальный_лот ) lot=Лот; // ограничение по количеству модификаций

if (lot if (lot > MarketInfo(Symbol(),MODE_MAXLOT)) lot=MarketInfo(Symbol(),MODE_MAXLOT); // ограничение по максимально допустимому лоту

//------------------------------------------------------------
// +++++++++++ модификация лота +++ конец ++++++++++++++++++++

В функцию "OrderSend" переменная "lot"



И последний вопрос - В функцию "OrderSend" переменная "lot" - не понятно что с этим нужно сделать?

С уважением
#2108


Меня смущают вот эти сами переменные, ведь они должны быть скоррелированы с теми, которые уже прописаны в советнике, так ведь? Или я что то не понимаю?


А вас не смущает что внешние переменные вы на Русском написали?
Приведу пример : extern double Lots = 0.1;
Строчка отправки ордера : OrderSend (Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, MagicNumber, 0, Blue);
похоже в неё вам и указывали вписать Lots , но не на Русском
наводите на непонятные переменные курсор и нажимайте F1 в метаедиторе,в справке примеры есть как должны выглядеть полностью строки с вашими примерами,в вашем колде для того чтоб торговал не дописаны функции отправки ордеров OrderSend.
И закоментированные слова на Русском после двойных слешей обязательно должны быть в одну строку!
#2109
Гриня, спасибо за ответ.

В том то и дело, что вижу что код кривой, но из-за недостатка опыта не могу понять в чем дело. :-/

Как Вы считаете, код вообще правильный, если добавить описанную Вами функцию (кстати ее вставить после всего куска кода?):

OrderSend (Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, MagicNumber, 0, Blue);

и Lots, я так понимаю, должен быть FixLot согласно описи в моем советнике, так?
#2110


Гриня, спасибо за ответ.
В том то и дело, что вижу что код кривой, но из-за недостатка опыта не могу понять в чем дело. :-/


Пожалуйста. Во первых разрисуйте полное тех задание для себя,что ? когда ? и как должен выполнить ваш советник !!! Полнейшее понимание в голове перенесите на лист бумаги для себя. Откройте метаэдитор и нажмите создать новый файл-эксперт.Обязательно к просмотру уроки xbms от которого и произошла эта ветка на сайте,вам урок номер 3 ,выучить бы наизусть. Сперва объявите внешние переменные вот например:
extern double Lots =0.1;
extern double StopLoss=50; // стоплосс
extern double TakeProfit=50; // тейкпрофит
extern int TrailingStop=5;
extern int Slippage=5;
extern int MagicNumber=123;
extern string ind_name = "Stochastic";//название индикатора
extern int Stoch_D = 48; //первый параметр индикатора
extern int Stoch_K = 8; //второй параметр индикатора
extern int Stoch_S = 16; //трeтий параметр индикатора
extern int H_level = 90; //уровень индикатора для открытия ордеров
Определитесь на основе какого или каких индикаторов будет работать советник их нужно прописать в коде. Начните размышлять логически, раз советник должен покупать и продавать значит должны быть OP_BUY , OP_SELL , соответственно он должен открывать и закрывать по Бидам Bid или Аскам Ask что тоже необходимо указать, отправки ордеров OrderSend , модификация выставления стопов и тейков OrderModify(OrderTicket(),OrderOpenPrice(), SL, TP,0,CLR_NONE);
OrderSelect и закрытие ордеров раз открывали OrderClose.
И открывайте кучу советников и читайте код для кругозора что и как у других реализовано.А просто вставить блок не получиться ,но шаблон со всеми готовыми функциями поищите вам это облегчит работу на начальном этапе. Или из урока перепишите,ну и все 120 страниц прочитать этой ветки тоже очень полезно. Я и сам читаю учусь.


#2111

А вас не смущает что внешние переменные вы на Русском написали?

Ёпрст, а я в своих совах по русски пишу..., а оказывается нельзя... :(
Vanka-Yanka
Приведённый код рабочий, только его надо правильно интегрировать в Ваш советник. переменные extern в начало совы.
остальной код непосредственно перед открытием ордера. Точнее подсказать невозможно по причине отсутствия полного кода.
#2112
0ll, добрый день.

Я вот тут вроде расписал в раннем письме - какие у меня переменные extern прописаны в СОВе и свои вопросы. Посмотрите плиз.

----------------------------------------------------------------------------------------------------------------------------------------------------------

Компиляцию провожу без ошибок, но все равно при тестировании после возникновении СЛ лот не увеличивается - не работают изменения. Возможно проблема с переменными?

Решил все по-порядку расписать, возможно ошибка найдется.

В моем советнике в описи использованы следующие переменные:

Лот - FixLot
Магик - EA_magic

В куске кода для примения Мартина, описано добавление еще двух перепенных в опись -

Цитата


Эта часть при описи переменных
extern double Лот = 0.01; // Для установки размера лота
extern double Максимальный_лот = 0.04; // Ограничение по максимально возможному лоту



Меня смущают вот эти сами переменные, ведь они должны быть скоррелированы с теми, которые уже прописаны в советнике, так ведь? Или я что то не понимаю?

И еще вопрос. Я извиняюсь, что не обладаю достаточными знаниями, возможно вопрос сам по себе будет звучать нелепо, но тем не менее - в какую часть советника вшивать этот кусок кода? Я его вставил сразу после описи переменных, правильно ли это?

Ниже привожу окончательный вариант кода, который прошел компиляцию, но не работает на практике.

Спойлер

Часть кода по модификации лота. Кидаем в любой советник.

Эта часть при описи переменных
extern double Лот = 0.01; // Для установки размера лота
extern double Максимальный_лот = 0.04; // Ограничение по максимально возможному лоту
Эта часть в начале основного кода

// +++++++++++ модификация лота +++ начало ++++++++++++++++++++
//-------------------------------------------------------------
double lot=Лот;

// узнаем лот последнего ордера и его прибыль
int i=1;
double order_history_profit=0;
double order_history_lot=0;

while (i {
OrderSelect (OrdersHistoryTotal()-i,SELECT_BY_POS,MODE_HISTORY);
if (EA_magic ==OrderMagicNumber( ) )
{
if (OrderSymbol() == Symbol())
{
order_history_profit = OrderProfit( );
order_history_lot = OrderLots();
break;
}
}
i++;
}
// увеличим размер лота если последний ордер убыточный
if (order_history_profit // уменьшим размер лота если последний ордер прибыльный
if (order_history_profit > 0) lot=Лот;
// упорядочивание лота при его выходе за пределы нормы

if (lot >= Максимальный_лот ) lot=Лот; // ограничение по количеству модификаций

if (lot if (lot > MarketInfo(Symbol(),MODE_MAXLOT)) lot=MarketInfo(Symbol(),MODE_MAXLOT); // ограничение по максимально допустимому лоту

//------------------------------------------------------------
// +++++++++++ модификация лота +++ конец ++++++++++++++++++++




Гриня написал, что в коде не хватает OrderSend (Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, MagicNumber, 0, Blue); куда ее вставить? Вконце кода?
#2113
Vanka-Yanka приведённый код - это расчёт лота и всё. этот код нужно вставлять в то место в сове, где уже принято решение на открытие сделки, т.е. если сова работает, то там уже есть ОрдерСенд - вот перед ним и вставлять.
Вы заставляете нас решать вслепую некие ребусы. Задачу интеграции мартина в сову можно решать значительно проще и разными приёмами.
#2114

Добрый день. Написал if(StopLoss>0) Sleep(1800000); чтоб при срабатывании стоплосса на 30 минут засыпал советник и не входил в сделки , но не срабатывает функция(не засыпает). Что посоветуете?

if (Bid >= PriceHigh - Indent*Point && StochZone >= 70 && CountSell() == 0)
{
RefreshRates();
SL = NormalizeDouble(Bid + StopLoss * Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, MagicNumber, 0, Red);
if(ticket>0)

{
if(StopLoss>0) Sleep(1800000);
if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify(OrderTicket(),OrderOpenPrice(), SL, TP,0,CLR_NONE);

}
}


if (Ask {
RefreshRates();
SL = NormalizeDouble(Ask - StopLoss * Point, Digits);
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);

ticket = OrderSend (Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, MagicNumber, 0, Blue);
if(ticket>0)

{
if(StopLoss>0) Sleep(1800000);
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify(OrderTicket(),OrderOpenPrice(), SL, TP,0,CLR_NONE);

}
}

#2115
Гриня
1. не советую использовать Слип и тем более на 30 минут.
2. if(StopLoss>0) Sleep(1800000); - это совсем не то, что Вы думаете. Отследить срабатывание СЛ нужно совсем по другому
нужно отслеживать ОрдерКлозеТайм > 0 (по текущему ордеру)
#2116

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

double Lots()
{
double lot = Lots;
int total = OrdersHistoryTotal();
for (int i = 0; i {
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderProfit() > 0 )

lot = Lots;
if( OrderProfit()
lot = lot * LotMnogitel;

}
}
return(lot);
}

#2117
Sharovik С этим кодом бот тормозить будет сильно. Надо цикл перебора ордеров с конца до 0 делать и прекращать цикл сразу после расчёта лота.
Условие будет такое - если первый найденный ордер лоссовый - выход, если профитный, то выставим флаг bool flPr = true; и ищем дальше. если второй найденный ордер лоссовый и флаг flPr == true, то мартин, иначе - выход.
#2118

сделал так, конечно понимаю что код громоздкий но по другому не умею. Вроде не особо тормозит бот. Спасибо.

double Lots()
{
double lot = Lots;
int total = OrdersHistoryTotal();
for (int i = 0; i {
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{

OrderProfit1 =OrderProfit();
OrderLots1= OrderLots();
}

OrderSelect(i-1, SELECT_BY_POS, MODE_HISTORY);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{

OrderProfit2=OrderProfit();
OrderLots2=OrderLots();
}


if (OrderProfit1 > 0 )
lot = Lots;

if( OrderProfit1
lot=Lots;

if( OrderProfit1


lot = lot + Lots;




}


return(lot);
}

#2119

Всем привет. Подскажите по заданию 3 вроде получилось сделать сову. Но я не как не могу понять как написать во входе в позицию
если цена выше Линии Хая, а потом пробила ее сверху вниз - вот тогда чтоб открылся ордер на продажу. Спасибо)

Experts_TMA_middle.ex44 скач.
Experts_TMA_middle.mq49 скач.

#2120


Всем привет. Подскажите по заданию 3 вроде получилось сделать сову. Но я не как не могу понять как написать во входе в позицию
если цена выше Линии Хая, а потом пробила ее сверху вниз - вот тогда чтоб открылся ордер на продажу. Спасибо)



Если предыдущий бар закрылся выше линии канала, а текущая цена - ниже линии канала = пробой сверху вниз
#2121



Всем привет. Подскажите по заданию 3 вроде получилось сделать сову. Но я не как не могу понять как написать во входе в позицию
если цена выше Линии Хая, а потом пробила ее сверху вниз - вот тогда чтоб открылся ордер на продажу. Спасибо)



Если предыдущий бар закрылся выше линии канала, а текущая цена - ниже линии канала = пробой сверху вниз


Спасибо, сейчас попробую

Добавлено: 18-04-2015 16:22:56




Всем привет. Подскажите по заданию 3 вроде получилось сделать сову. Но я не как не могу понять как написать во входе в позицию
если цена выше Линии Хая, а потом пробила ее сверху вниз - вот тогда чтоб открылся ордер на продажу. Спасибо)



Если предыдущий бар закрылся выше линии канала, а текущая цена - ниже линии канала = пробой сверху вниз


Спасибо, сейчас попробую

Вроде получилось:
if (Close[1] > PriceHigh && Bid Но что то не понятно через некоторое время открывает кучу ордеров в бай

EURUSDM5.png

Изменено 18 апреля, 2015 пользователем sanyasan

#2122
Sharovik спасибо за спасибо, но имейте в виду - Ваш код только для тестера - в реале может работать не правильно, если на счете несколько сов работают.
#2123
sanyasan, тогда надо бы последнюю вашу версию посмотреть полностью.
#2124




Всем привет. Подскажите по заданию 3 вроде получилось сделать сову. Но я не как не могу понять как написать во входе в позицию
если цена выше Линии Хая, а потом пробила ее сверху вниз - вот тогда чтоб открылся ордер на продажу. Спасибо)



Если предыдущий бар закрылся выше линии канала, а текущая цена - ниже линии канала = пробой сверху вниз


Спасибо, сейчас попробую

Добавлено: 18-04-2015 16:22:56




Всем привет. Подскажите по заданию 3 вроде получилось сделать сову. Но я не как не могу понять как написать во входе в позицию
если цена выше Линии Хая, а потом пробила ее сверху вниз - вот тогда чтоб открылся ордер на продажу. Спасибо)



Если предыдущий бар закрылся выше линии канала, а текущая цена - ниже линии канала = пробой сверху вниз


Спасибо, сейчас попробую

Вроде получилось:
if (Close[1] > PriceHigh && Bid Но что то не понятно через некоторое время открывает кучу ордеров в бай



sanyasan, нужно понимать, что на бай у Вас аналогично задано условие, только уже идет подсчет ордеров на бай. Думаю, что у Вас не правильно работает ф-ция CountSell(). Выведите её значение в комент или принт, тога будет ясно.
#2125

Всем привет!
Нужна помощь в определении двух одинаковых значений High на протяжении 10 баров.
Прошу помочь.

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

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