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

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


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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
77павел не хотите проценты берите в деньгах - просто и сердито.

dslone я думаю дело в объектах, которые Вы создаёте в Инит и не удаляете. При перезапуске МТ пытается создать объекты с теми-же именами и получает ошибку. т.е. в Вашем индюке при перезапуске процедура Инит вылетает с ошибкой. Надо чистить объекты за собой или перед созданием проверять наличие...

kempo у Вас в OrderLots() что происходит? + if(!OrderClose....) здесь что-то напутали с логикой + эту строчку: _OR_err = GetLastError(); надо перед Принтом ставить (после OrderClose), а то не понятно когда ошибка возникла.
+ в начале функции желательно воткнуть ResetLastError();

oleguitar Вы как всегда недоговариваете... У Вас советник или индюк? если индюк нужны буфера со стрелочками. если сова, то надо графический объект создавать.
  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Перейти

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

Перейти

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

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

Индюк был бы лучше, но я только писать не умею их совершенно...
Допустим, мне нужно, чтобы отмечались стрелоской все свечи, размер которых более N пунктов

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

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

OrderLots() возвращает количество лотов выбранного ордера...а что не так???а на счет OrderClose...в чем именно нарушена логика???
PS функцию мне написали чуть ранее, Денис помоему, поэтому сейчас пытаюсь самодогоняй врубить...
С ув.

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
oleguitar скачай любой индюк со стрелочками и замени начинку.
kempo насчет OrderLots это я прогнал >:dнасчёт логики: "Ф-ция OrderClose Возвращает true при успешном завершении функции или false в случае ошибки."
Получается что Принт ошибки работает когда её нет (из-за !). И разберитесь с определением ошибки - в идеале нужно так:
ResetLastError();
if(!OrderClose.... )
{//Блок обработки ошибки
_OR_err = GetLastError(); Print("Ошибка закрытия ордера "+IntegerToString(_OR_err));}
else {//Ордер закрыт без ошибки
....}
Ссылка на сообщение
Поделиться на другие сайты

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


oleguitar скачай любой индюк со стрелочками и замени начинку.
kempo насчет OrderLots это я прогнал >:dнасчёт логики: "Ф-ция OrderClose Возвращает true при успешном завершении функции или false в случае ошибки."
Получается что Принт ошибки работает когда её нет (из-за !). И разберитесь с определением ошибки - в идеале нужно так:
ResetLastError();
if(!OrderClose.... )
{//Блок обработки ошибки
_OR_err = GetLastError(); Print("Ошибка закрытия ордера "+IntegerToString(_OR_err));}
else {//Ордер закрыт без ошибки
....}


прошу прощения ув. Oll за глупый вопрос...что я должен написать в этой строчке???else {//Ордер закрыт без ошибки
....}
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
kempo напиши Print("Удалил всё-таки!");, а если серьёзно - не знаю. Вот это: error = true; - зачем писали?
Ссылка на сообщение
Поделиться на другие сайты

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

если я все правильно понял, то вот так....но все равно не работает...ошибка так и не уходит...
bool Close_Orders(int mag, int otype)
{
int _OR_err;

for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == mag && OrderType() == otype)
{
if (otype == OP_BUY)
RefreshRates();
ResetLastError();

if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(),MODE_BID), Slippage, clrBlue))
{
_OR_err = GetLastError();
Print("Ошибка закрытия ордера " + IntegerToString(_OR_err));
}
else
Print("Хозяин, я удалил ордера!!!");
if (otype == OP_SELL)
RefreshRates();
ResetLastError();

if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(),MODE_ASK), Slippage, clrRed))
{
_OR_err = GetLastError();
Print("Ошибка закрытия ордера " + IntegerToString(_OR_err));
}
else
Print("Хозяин, я удалил ордера!!!");
}
Sleep(500);
}
}
return(false);
}

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

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

Я тут заметил нарушение структуры, вы проверяете тип ордера и потом просто обновляете данные, нужно наверное просто добавить пару фигурных скобочек.
bool Close_Orders(int mag, int otype)
{
int _OR_err;

for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == mag && OrderType() == otype)
{
if (otype == OP_BUY)
{
RefreshRates();
ResetLastError();
if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(),MODE_BID), Slippage, clrBlue))
{
_OR_err = GetLastError();
Print("Ошибка закрытия ордера " + IntegerToString(_OR_err));
}
else
Print("Хозяин, я удалил ордера!!!");
}
if (otype == OP_SELL)
{
RefreshRates();
ResetLastError();
if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(),MODE_ASK), Slippage, clrRed))
{
_OR_err = GetLastError();
Print("Ошибка закрытия ордера " + IntegerToString(_OR_err));
}
else
Print("Хозяин, я удалил ордера!!!");
}
}
Sleep(500);
}
}
return(false);
}

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

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


dslone я думаю дело в объектах, которые Вы создаёте в Инит и не удаляете. При перезапуске МТ пытается создать объекты с теми-же именами и получает ошибку. т.е. в Вашем индюке при перезапуске процедура Инит вылетает с ошибкой. Надо чистить объекты за собой или перед созданием проверять наличие...



удаление есть в OnDeinit, только в выложенном файле оно закомментировано. Если раскомментировать, то после перезапуска терминала, на месте вывода лотов появляются надписи Label.
Ссылка на сообщение
Поделиться на другие сайты

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

А есть примеры таких индикаторов?
А то я смотрю, сложноватые все
Вот такое переделал, но он не отображается даже в индикаторах
p.s. все комментарии писал не я

Спойлер


#property copyright "-"
#property link "-"
//---- отрисовка индикатора в главном окне
#property indicator_chart_window
//---- количество индикаторных буфферов
#property indicator_buffers 2
//---- цвета индикатора
#property indicator_color1 Blue
#property indicator_color2 Red
//---- входные параметры индикатора
extern int atr_period = 100;
extern double atr_k = 3;


int MA_Slow = 260;
//---- индикаторные буфферы
double buf_1[];
double buf_2[];
//+------------------------------------------------------------------+
//| Функция инициализации, запускается один раз |
//+------------------------------------------------------------------+
int init()
{
//---- 2 индикаторных буффера использованы для счёта
SetIndexBuffer(0, buf_1);
SetIndexBuffer(1, buf_2);
//---- Стиль исполнения графика
//---- DRAW_ARROW - стрелки(символы)
SetIndexStyle (0, DRAW_ARROW, STYLE_SOLID, 3);
SetIndexStyle (1, DRAW_ARROW, STYLE_SOLID, 3);
SetIndexArrow (0, 233);
SetIndexArrow (1, 234);
//---- установка значений индикатора, которые не будут видимы на графике
SetIndexEmptyValue(0,0.0);
SetIndexEmptyValue(1,0.0);
//---- установка номера бара, начиная с которого будет отрисовываться индикатор
SetIndexDrawBegin(0,MA_Slow);
SetIndexDrawBegin(1,MA_Slow);
//---- завершение инициализации
return (0);
}
//+------------------------------------------------------------------+
//| Основная Функция, запускается на каждом тике |
//+------------------------------------------------------------------+
int start()
{
//---- проверка количества баров на достаточность для расчёта
if (Bars //---- получение уже посчитанных баров
int ExtCountedBars = IndicatorCounted();
//---- проверка на возможные ошибки
if (ExtCountedBars //---- последний посчитанный бар должен быть пересчитан
if (ExtCountedBars > 0) ExtCountedBars--;
//---- основной цикл расчёта индиатора
for (int i=Bars - ExtCountedBars-1;i>=0; i--)
{
//---- получение значений индикатора в переменные

double high1 = High[1];
double low1 = Low[1];
double open1 = Open [1];
double close1 = Close [1];

double atr = iATR(Symbol(), 0, atr_period, 1);

/*
double MA_Fast_1 = iMA(NULL, 0, MA_Fast, 0, MODE_EMA, PRICE_CLOSE, i+1);
double MA_Slow_1 = iMA(NULL, 0, MA_Slow, 3, MODE_LWMA, PRICE_CLOSE, i+1);
double MA_Fast_2 = iMA(NULL, 0, MA_Fast, 0, MODE_EMA, PRICE_CLOSE, i+2);
double MA_Slow_2 = iMA(NULL, 0, MA_Slow, 3, MODE_LWMA, PRICE_CLOSE, i+2);
*/
//---- проверка условий по вашим правилам и отрисовка стрелки
// if (MA_Fast_1 > MA_Slow_1 && MA_Fast_2 // if (MA_Fast_1 = MA_Slow_2) buf_2[i+1] = High[i+1] + 10 * Point;

if(close1 {
if((high1-close1) > NormalizeDouble((atr*atr_k),5)) buf_2[i+1] = High[i+1] + 10 * Point;
}


if(close1>open1)
{
if((open1-low1) > NormalizeDouble((atr*atr_k),5)) buf_1[i+1] = Low[i+1] - 10 * Point;
}

}
//---- завершение основной функции
return (0);
}
//---- end

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
oleguitar переписал для 600 билда. изучай пользуйся.
Добавил дельту (отступ) от графика, а то за стрелками его не видно
+ исправил логику вместо: open1-low1 - close1-low1.

Ind_Strelki.mq4

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

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


oleguitar переписал для 600 билда. изучай пользуйся.
Добавил дельту (отступ) от графика, а то за стрелками его не видно
+ исправил логику вместо: open1-low1 - close1-low1.



Ага, спасибо большое)
С логикой поэкспериментирую еще
Ссылка на сообщение
Поделиться на другие сайты

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

Всем привет!
Знающим прошу помочь:
как рассчитать профит закрытого ордера на бинарных опционах?
после закрытия ордера в истории счета пишет (см вложении 1). в данном случае профит считает=0.
после отображения ВСЕЙ истории (см вложение 2) профит считает=0.7.

как рассчитать что бы после закрытия ордера, профит считался сразу=0.7?

функция расчета профита вот такая:
double profit()
{
int oldticket;
double orderprofit=0.0;
ticket = 0;
for (int i=OrdersHistoryTotal()-1; i>=0;i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == OP_BUY||OrderType() == OP_SELL))
{
oldticket=OrderTicket();
if(oldticket>ticket)
{
orderprofit=OrderProfit()+OrderCommission()+OrderSwap();
ticket=oldticket;
}
}
}
}
return (NormalizeDouble(orderprofit,2));
}

1.png
2.png

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Crik не знаю чем Вам помочь... Профит, который считает сова и профит который показывает МТ - разные вещи, совсем, тем более не при обычных торгах, а в опционах - это же по-сути пари, а размер маржи - Ваша ставка...
Ссылка на сообщение
Поделиться на другие сайты

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


Crik не знаю чем Вам помочь... Профит, который считает сова и профит который показывает МТ - разные вещи, совсем, тем более не при обычных торгах, а в опционах - это же по-сути пари, а размер маржи - Ваша ставка...



тогда почему, при нажатии отображения ВСЕЙ истории профит ордера становится =(профит ордера)+(стоимость выигрыша по закрытию опциона), в данном случае =0+0,7=0,7
Ссылка на сообщение
Поделиться на другие сайты

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

Oll, Доброго времени, после событий в январе с франком. я все таки решил к своей сове прикрутить стопы.но вот не задача.к одной паре без проблем. а вот одновременно к семи парам,не получается.хотя фильтрация ордеров идет по магику.Задача состоит в том что бы прикрутить стоп лоссы и тейк профиты к 7 разным валютным парам.Вы наверное помните эту систему, вы даже индикатор писали для нее, как говорится своего производства.Подскажите, если не затруднит, как разобраться с этим делом, пока хотя бы в теории.В практике попробую сам,ну ели, не будет получаться,тогда уже буду дальше интересоваться!

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
denis77515 кукловод наверно...
Дык стопы прикручиваются через тикет ордера, только цены надо брать через МаркетИнфо.
Я не писал мультивалютных роботов - таких задач не стояло, но не вижу препятствий.
А без стопов Ваш бот как идёт? большие просадки?
Ссылка на сообщение
Поделиться на другие сайты

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

Да честно говоря последнее время,не очень он работает, в том смысле что сама система. Я в теме кукловода ссылку на мониторинга оставил, посмотрите.Но она еще система такая что на долго срок, если даст 100% прибыли в течении года, то сам думаю ее на реал ставить, а пока все эксперименты,да доработки. Я сидел тут как то пару дней сней,так в тол и не взял, как можно смодифицировать сразу кучу ордеров,да еще по разным парам. Вы имеете в виду, в ордео селект, за место
селект бай пос, написать селект бай тикет. и от этого, уже смотреть дальше ? Жаль сегодня пятница,завтра если напишу, то проверить не смогу.

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

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


Вы имеете в виду, в ордео селект, за место селект бай пос, написать селект бай тикет. и от этого, уже смотреть дальше ?

Нет я точно имел в виду другое... :d
1. Одна сова открывает все ордера? или эти ордера по другому открываете?
2. Если магики одинаковые, делаете цикл с сортировкой по магику. В итоге у Вас выбран (Select) ордер.
3. Рассчитываете уровень СЛ, типа: MarketInfo(OrderSymbol(), MODE_BID) + SL*_Point;
4. Ну и модификация...
5. Если данная конструкция заработает в тестере на одной паре, то в реале и на всех работать будет.
Ссылка на сообщение
Поделиться на другие сайты

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

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

Спойлер

[

bool ModifyOrder(int mag, int otype=-1 ,string sy="")
{
double sl = 0,
tp = 0;

if (sy=="0") sy=Symbol();

for(int i=OrdersTotal()-1; i >= 0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if((OrderSymbol() == sy || sy =="") && (mag {
if(otype == OP_BUY || otype == OP_SELL)
{
if(otype == OP_BUY)
{
while(true)
{
sl = High[1] - iATR(Symbol(),0,ATR_Period,ATR_Shift) * ATR_Multipler_SL;
tp = High[1] + iATR(Symbol(),0,ATR_Period,ATR_Shift) * ATR_Multipler_TP;
OrderModifyReliable(OrderTicket(),OrderOpenPrice(),sl,tp,0,clrGreenYellow);break;
}
}
else

if(otype == OP_SELL)
{
while(true)
{
sl = High[1] + iATR(Symbol(),0,ATR_Period,ATR_Shift) * ATR_Multipler_SL;
tp = High[1] - iATR(Symbol(),0,ATR_Period,ATR_Shift) * ATR_Multipler_TP;
OrderModifyReliable(OrderTicket(),OrderOpenPrice(),sl,tp,0,clrGreenYellow); break;
}

}
}
}
}
}
return(false);
}




















]

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
denis77515 сомневаюсь, что код рабочий - полно ошибок.
1. АТР вычисляй 1 раз ДО цикла, что-ж Вы в цикле на каждом проходе 4 раза к индюку обращаетесь?
(я не знаю как компилятор МТ устроен, но призываю не надеяться на его эффективность)
2. Стопы для Селл по хаям - это понимаю, а стопы для бая по хаям ? про ТР - молчу, хотя если цена убежала от хая далеко, то вычисленный по хаю ТР не установится, а проверки нет...
3. Проверки успешности модификации нет.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


denis77515 сомневаюсь, что код рабочий - полно ошибок.
1. АТР вычисляй 1 раз ДО цикла, что-ж Вы в цикле на каждом проходе 4 раза к индюку обращаетесь?
(я не знаю как компилятор МТ устроен, но призываю не надеяться на его эффективность)
2. Стопы для Селл по хаям - это понимаю, а стопы для бая по хаям ? про ТР - молчу, хотя если цена убежала от хая далеко, то вычисленный по хаю ТР не установится, а проверки нет...
3. Проверки успешности модификации нет.


Oll я пробовал по лоу, ставить, не получилось, не модефицирует совсем, по этому я сделал там мультиплер. допустим по бай, sl = High[1] - iATR * 2,33, а tp = High[1] + iATR*3,5, не знаю работает, пользуюсь пока скриптом.по поводу проверки модификации так OrderModifyReliable здесь целая функция проверки на ошибки.вот она.
Спойлер



bool OrderModifyReliable(int aticket, double aprice, double stoploss,
double takeprofit, datetime expiration,
color arrow_color = CLR_NONE)
{
if (IsStopped())
{
Print("Ошибка, остановлен: IsStopped() == true");
return(false);
}

int cnt = 0;
while(!IsTradeAllowed() && cnt {
Sleep(100);
cnt++;
}
if (!IsTradeAllowed())
{
Print("Ошибка: Операция недопустима - IsTradeAllowed()==false");
_OR_err = ERR_TRADE_CONTEXT_BUSY;
return(false);
}



// if (false)
{
if(OrderSelect(aticket, SELECT_BY_TICKET, MODE_TRADES))
string asymbol = OrderSymbol();
int adigits = MarketInfo(asymbolx, MODE_DIGITS);
if (adigits > 0)
{
aprice = NormalizeDouble(aprice,adigits);
stoploss = NormalizeDouble(stoploss,adigits);
takeprofit = NormalizeDouble(takeprofit,adigits);
}
if (stoploss != 0) OrderReliable_EnsureValidStop(asymbolx,aprice,stoploss);
}

int err = GetLastError(); // so we clear the global variable.
err = 0;
_OR_err = 0;
bool exit_loop = false;
cnt = 0;
bool result = false;

while (!exit_loop)
{
if (IsTradeAllowed())
{
result = OrderModify(aticket, aprice, stoploss,
takeprofit, expiration, arrow_color);
err = GetLastError();
_OR_err = err;
}
else
cnt++;

if (result == true)
exit_loop = true;

switch (err)
{
case ERR_NO_ERROR:
exit_loop = true;
break;

case ERR_NO_RESULT:
exit_loop = true;
break;

case ERR_SERVER_BUSY:
case ERR_NO_CONNECTION:
case ERR_INVALID_PRICE:
case ERR_OFF_QUOTES:
case ERR_BROKER_BUSY:
case ERR_TRADE_CONTEXT_BUSY:
case ERR_TRADE_TIMEOUT: // for modify this is a retryable error, I hope.
cnt++; // a retryable error
break;

case ERR_PRICE_CHANGED:
case ERR_REQUOTE:
RefreshRates();
continue; // we can apparently retry immediately according to MT docs.

default:
// an apparently serious, unretryable error.
exit_loop = true;
break;

} // end switch

if (cnt > retries)
exit_loop = true;

if (!exit_loop)
{
Print("Ошибка, попыток: (" + IntegerToString(cnt) + "/" + IntegerToString(retries) +
"): " + OrderReliableErrTxt(err));
Sleep(500);
RefreshRates();
}

if (exit_loop)
{
if ((err != ERR_NO_ERROR) && (err != ERR_NO_RESULT))
Print("Ошибка: " + OrderReliableErrTxt(err));
}
}

// we have now exited from loop.
if ((result == true) || (err == ERR_NO_ERROR))
{
Print("Успешная модификация");
if(OrderSelect(aticket, SELECT_BY_TICKET, MODE_TRADES))
OrderPrint();
return(true); // SUCCESS!
}

if (err == ERR_NO_RESULT)
{
return(true);
}

Print("Ошибка модификации после " + IntegerToString(cnt) + " попыток");
Print("Ошибка модификации: " + IntegerToString(aticket) + " " + asymbolx +
"@" + DoubleToStr(aprice,_Digits) + " tp@" + DoubleToString(takeprofit,_Digits) + " sl@" + DoubleToString(stoploss,_Digits));
Print("Ошибка : " + OrderReliableErrTxt(err));

return(false);
}
//+------------------------------------------------------------------+
void OrderReliable_EnsureValidStop(string asymbol, double aprice, double &asl)
{
// Return if no S/L
if (asl == 0)
return;

double servers_min_stop = MarketInfo(asymbol, MODE_STOPLEVEL) * MarketInfo(asymbol, MODE_POINT);

if (MathAbs(aprice - asl) {
// we have to adjust the stop.
if (aprice > asl)
asl = aprice - servers_min_stop; // we are long

else if (aprice asl = aprice + servers_min_stop; // we are short

else
Print("EnsureValidStop: error, passed in aprice == sl, cannot adjust");

asl = NormalizeDouble(asl, MarketInfo(asymbol, MODE_DIGITS));
}
}
//+------------------------------------------------------------------+
string OrderReliableErrTxt(int err)
{
return ("" + IntegerToString(err) + ":" + ErrorDescription(err));
}











]

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

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

Помогите пожалуйста с кодом функции работающий 4 знаком. Суть функции такова.
Чтоб советник открыл сделку на покупку когда цена направляется на вверх на определенный тик без отката (например 4 или 5 пункта без возврата, нужна чтоб можно указать в параметрах) и соответственно на продажу, если цена направляется вниз, и чтоб ордер был только одним т.е. чтоб не открывал пока не закроется другой. И нужно добавить трейлинг стоп в пунктах, чтоб можно было изменить в параметрах. СЛ и ТП думаю добавлю сам как то.

Спасибо!

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

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

Господа, я только начал программить после просмотра трех уроков видео курса)) сразу столкнулся с проблемой.
Значит требуется сделать советник на основе индикатора ТМА. По задумке сова продает от верхней границы индикатора, покупает от нижней.

Спойлер


extern double Lots = 0.1;
extern int StopLoss = 30;
extern int TakeProfit = 30;
extern int Slippage = 5;
extern string comment = "TMA BOT";
extern int Magic = 123;
extern string Indicator = "Данные индикатора";
extern string TimeFrame = "current time frame";
extern int HalfLength = 56;
extern int Price = PRICE_CLOSE;
extern double ATRMultiplier = 2.0;
extern int ATRPeriod = 100;
extern bool Interpolate = true;

double PriceHigh, PriceLow, SL, TP, OT;
int ticket, count;
//+------------------------------------------------------------------+
int init()
{
//Проверка брокера на пятизнак
if (Digits ==3 || Digits == 5)
TakeProfit *=10;
StopLoss *=10;
Slippage *=10;
}
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
void OnTick()
{
/// Обозначаем верхнюю и нижнюю границы канала ТМА
PriceHigh = iCustom(Symbol(), 0, "TMA with Distances", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0);
PriceLow = iCustom(Symbol(), 0, "TMA with Distances", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0);

//Условия на продажу
if(Bid >= PriceHigh && CountSell() == 0 )
{
SL=NormalizeDouble(Bid + StopLoss*Point, Digits);
TP=NormalizeDouble(Bid - TakeProfit*Point, Digits);

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0, Red);
if ( ticket > 0)
{
if( OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES )==true)
OrderModify( ticket, OrderOpenPrice(), SL, TP, 0 );
}
}
//Условия на покупку
if( Ask {
SL=NormalizeDouble(Ask - StopLoss*Point, Digits);
TP=NormalizeDouble(Ask + TakeProfit*Point, Digits);

ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, Magic, 0, Blue);
if ( ticket > 0)
{
if( OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES )==true)
OrderModify( ticket, OrderOpenPrice(), SL, TP, 0 );
}

}
}
//+------------------------------------------------------------------+
int CountBuy()

{
count = 0;
for (int trade = OrdersTotal()-1; trade >=0; trade --)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() ==Symbol() && OrderMagicNumber() == Magic)
{
if(OrderType() == OP_BUY)
count ++;
}
}
return(count);
}
//+------------------------------------------------------------------+
int CountSell()
{
count = 0;
for (int trade = OrdersTotal()-1; trade >=0; trade --)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() ==Symbol() && OrderMagicNumber() == Magic)
{
if(OrderType() == OP_SELL)
count ++;
}
}
return(count);
}




В общем советник делает все что хочет, только не то что хочу я:(
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Войти

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

Войти

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


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

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