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

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


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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
vitek01
объяви bool STOP = true; только на глобальном уровне (перед OnTick)
и вместо if ( tiket == 1 ) сделай if ( tiket >= 0 )
попробуй, должно работать
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Перейти

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

Перейти

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

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

Кто-нибудь имеет хорошо написанный ассоциативный словарь? Так надоело все с 0 уже писать.

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

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


vitek01
объяви bool STOP = true; только на глобальном уровне (перед OnTick)
и вместо if ( tiket == 1 ) сделай if ( tiket >= 0 )
попробуй, должно работать


Спасибо действительно помогло! при достижений уровня по условию открывается ордер на покупку, но при закрытий по стоп лоссу , сразу открывается один левый ордер на покупку, закрывшись в минус больше ордеров не открывается.
а дальше по условию. и опять левый ордер если уровень активируется .
А теперь вопрос - откуда он берется этот левак?
Еще хотелось бы уроки по созданию обьектов, линий на графике и операций с ними!

Добавлено: 16-02-2016 05:22:46



vitek01
объяви bool STOP = true; только на глобальном уровне (перед OnTick)
и вместо if ( tiket == 1 ) сделай if ( tiket >= 0 )
попробуй, должно работать


Спасибо действительно помогло! при достижений уровня по условию открывается ордер на покупку, но при закрытий по стоп лоссу , сразу открывается один левый ордер на покупку, закрывшись в минус больше ордеров не открывается.
а дальше по условию. и опять левый ордер если уровень активируется .
А теперь вопрос - откуда он берется этот левак?
Еще хотелось бы уроки по созданию обьектов, линий на графике и операций с ними!

Разобрался, в пользовательскую функцию СountBuy() после счетчика Count++, добавил оператор присваивания флага false булевской переменой STOP. Также убрал флаг после открытия ордера. И последнее, условие if(tiket==1) верно, так как мы работаем с одним ордером.
Приятно всетаки самому разобратся, так и опыт набирается. Спасибо!

line_Orders.mq4

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

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


И последнее, условие if(tiket==1) верно, так как мы работаем с одним ордером.

Это не верно. В реале тикеты будут совсем другие.


Кто-нибудь имеет хорошо написанный ассоциативный словарь? Так надоело все с 0 уже писать.

Поясни что это :d а то может имеешь такую ценность и не знаешь...
Ссылка на сообщение
Поделиться на другие сайты

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

Приветствую, Господа. Такой вопрос меня мучает: в рамках тех или иных уроков рассматривается инструмент, который позволяет контролировать количество открываемых сделок. Как правило сводится это к одному рыночному OP_BUY и одному OP_SELL + проверка по magic'у или установка нового ордера тем или иным образом опирается на предыдущий. Но как быть если мною писанный советник подразумевает несколько сигналов, то есть формально при трех сигналах возможно до 6 позиций по разным ценам: три вверх и три вниз. Я подошел к решению этой задачи таким образом, что думаете об этом:
bool busy(int mn)//mn - magic number
{
for(int i=0;i {
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
switch(OrderType())
{
case OP_BUY:
if(OrderType() == OP_BUY && OrderMagicNumber() == mn)
{
bool b = true;
}
case OP_SELL:
if(OrderType() == OP_SELL && OrderMagicNumber() == mn)
{
b = true;
}
}
}
}
return(b);
}

Разумеется открытие ордеров, сопряженное с тем или иным сигналом, должно присваивать соответствующие magicи, а после устраивается проверка, скажем вот так:
if(busy(11) == 0 && ...)OrderSend(Symbol(),OP_BUY,0.01,Ask,0,0,0,0,11);

if(busy(12) == 0 &&...)OrderSend(Symbol(),OP_SELL,0.01,Ask,0,0,0,0,12);

if(busy(21) == 0 && ...)OrderSend(Symbol(),OP_BUY,0.01,Ask,0,0,0,0,21);

if(busy(22) == 0 &&...)OrderSend(Symbol(),OP_SELL,0.01,Ask,0,0,0,0,22);

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Al.exe.in делай как удобно. бывают разные алгоритмы - есть такое, что кол-во открытых ордеров вообще знать не надо... сова открывает ордер выставляет стоп и тейк и забывает о нём...
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Al.exe.in у тебя ошибки.
1. функция всегда будет возвращать true.
далее - при компиляции тебе компилятор скажет как минимум об одной критичной ошибке - для селл переменная b не определена. ты объявил ее в другом блоке для бай, вне зоны видимости следующего блока для селл.
в самом начале еще до входа в цикл объяви b как

bool b = false;

и убери слово bool в блоке для бай

2. в кейсе необязательно опять проверять на тип ордера. если он бай, то кейс и выберет бай, а ты зачем-то в бае опять проверяешь бай это или не бай.

3. при открытии ордеров будут сыпаться 130 ошибки. ордера на бай открываются только по цене Ask, ордера селл открываются только по цене Bid.

4. неявная ошибка - в цикле перебор ордеров всегда лучше делай от последнего к первому. уже неоднократно обсуждалось почему.

5. еще одна неявная ошибка. параметр Slippage в OrderSend никогда не ставь равным нулю. Ордера у тебя тупо не смогут открыться из-за того что мы не в вакуумном идеальном мире живем.
всегда задавай точность не менее 10, а лучше 30.

6. еще одна ошибка уже непосредственно оптимизации кода. когда ты в цикле уже нашел ордер, у которого есть такой же магик, то смысл тебе дальше идти по остальным ордерам? лучше сразу же внепланово выйти из цикла.
делается это просто.
вместо внесения значений в булевую переменную b тру или фолс сразу же пиши return false.
а в самом конце функции пиши return true.

7. неявная ошибка вызова функции и проверки ее возврата. это булевая функция. с вышеуказанным пунктом лучше прописать
if (busy(номермагика)) ...

дополнение:
выставление ордеров и удаление лучше делать в цикле с ограниченным количеством попыток.
например:

if(busy(22) &&...)
{
int k=10; // кол-во попыток
while (k>0)
{
RefreshRates(); // обновляем котировки
if (OrderSend(Symbol(),OP_SELL,0.01,Bid,0,0,0,30,22)>0) // OrderSend возвращает номер тикета ордера в случае успеха, иначе "-1"
{
break; // аварийно выходим из цикла while
}
Sleep(100); // если ордер не выставился(тикет меньше нуля) ждем 0,1 секунды и уменьшаем k на единицу
k--;
}
}
Изменено пользователем dermitay
  • Лайк 4
Ссылка на сообщение
Поделиться на другие сайты

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

В папке Scripts_for_orders_any_1 (из архива Scripts_for_orders.rar к посту)
есть много готовых скриптов по ордерам, с настройками.

В т.ч. от Кима, закрытие/открытие ордеров с настройкой СЛ и ТП, перевода в БУ, закрыть все прибыльные ордера,
Удаление всех тейков и стопов, Удалить все отложенные ордера, Удаление всех объектов,
к-е явно можно завести на кнопки в панельку от индикатора и использовать в окне пары.

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

***

Много таких полезных скриптов по ордерам тут:

Спойлер

1. __http://time-forex.com/skripty
в т.ч.
-Тейк профит для отложенных ордеров, -Установка отложенных ордеров мышкой, -Скрипт удаления отложенных ордеров,
-Скрипт - Стопы на все ордера (для переделки на: Стоп-ордера на все ордера и Заменить стоп-лосс на стоп-орлдер по всем ордерам),
- Расчет волатильности рынка, -Скрипт риска и расчета стоп лосс и тейк профит,
- Скрипт определения уровня без убытка, -Скрипт set 2 stop orders – два отложенных ордера(в 2 стороны)

2. __http://forexpunkt.ru/script/
-Закрыть ордера Buy, -Закрыть ордера Sell, -Лёгкая установка отложенных ордеров

3. Скрипт Stop Orders Mouse __http://forexva.ru/skript-stop-orders-mouse/
В зависимости от того, в какую точку вы кинете скрипт, он и выставит отложенный ордер — если выше цены Buystop, ниже Sellstop.
В настройках скрипта есть возможность установки фиксированного лота или процента от депо, стоплосса, тейкпрофити и магика ордеров.

Выставление ордеров мышью на графике
__http://finbay.ru/skripty-metatrader4/ustanovka-orderov-myshju.html



-----
ФОРУМЫ. Подборки скриптов.
-----

Спойлер

Скрипты для упрощения работы с ордерами.
__http://forum.roboforex.ru/showthread.php?t=1992

__http://ruforum.mt5.com/threads/68817-neskolko-skriptov-dlya-uproshcheniya-torgovli



Сборки скриптов от пользователей форума Forum Forex-Investo'RU → Рынок Форекс → Советники, АТС, Индикаторы, сигналы

__http://forum.forex-investo.ru/index.php?/topic/1912-%D0%BF%D0%BE%D0%BB%D0%B5%D0%B7%D0%BD%D1%8B%D0%B5-%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D1%8B-%D0%BF%D1%80%D0%B8%D1%8F%D1%82%D0%BD%D0%B0%D1%8F-%D0%BC%D0%B5%D0%BB%D0%BE%D1%87%D1%8C-%D0%BE%D0%B1%D0%B7%D0%BE%D1%80-%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82/





Добавлено: 16-02-2016 13:23:56


Похожий вариант: __https://www.mql5.com/ru/articles/1683#c1_8
см.
Цитата

1.8. Замена стоп-лосс уровней на Buy Stop Limit и Sell Stop Limit ордера в своем эксперте
Снова вернемся к нашей панели, описанной в пункте 1.5 данной статьи.
Попробуем модифицировать ее, чтобы помимо входа в рынок с помощью лимитных ордеров
она позволяла устанавливать нам защитные остановки с помощью Buy Stop Limit и Sell Stop Limit ордеров.



Спойлер

Для этого в панели создадим еще одно поле "Stop Loss Level".
Теперь наша панель будет выглядеть следующим образом:

Рис. 14. Установка стоп-лосс уровня в панели DevaitionPanel.

Наиболее значимых изменений в уже знакомом нам коде два:
теперь в классе CDevPanel появился новый метод, ответственный за установку Buy Stop Limit и Sell Stop Limit ордеров.
Также модифицировался метод OnObjClick, открывающий новую позицию.
Исходный код этих методов следующий:


//+------------------------------------------------------------------+
//| End obj click |
//+------------------------------------------------------------------+
void CDevPanel::OnObjClick(string sparam)
{
if(sparam==m_buy_button_name)
{
if(Trade.BuyLimit(1,CalcCurrentPrice(OP_BUY)))
SendStopLoss(OP_BUY);
}
if(sparam==m_sell_button_name)
{
if(Trade.SellLimit(1,CalcCurrentPrice(OP_SELL)))
SendStopLoss(OP_SELL);
}
ObjectSetInteger(0,sparam,OBJPROP_STATE,false);
Sleep(100);
ChartRedraw();
}
//+------------------------------------------------------------------+
//| Send SL order |
//+------------------------------------------------------------------+
bool CDevPanel::SendStopLoss(int op_type)
{
if(op_type==OP_BUY)
{
double bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
if(m_sl_level>=0.0 && m_sl_level {
MqlTradeRequest request={0};
request.action = TRADE_ACTION_PENDING;
request.symbol = Symbol();
request.volume = 1.0;
request.price=m_sl_level;
request.stoplimit=m_sl_level -(m_deviation*Point());
request.type=ORDER_TYPE_SELL_STOP_LIMIT;
request.type_filling=ORDER_FILLING_RETURN;
request.type_time=ORDER_TIME_DAY;
MqlTradeResult result;
bool res=OrderSend(request,result);
if(!res)
Print("Error set S/L. Reason: "+(string)GetLastError());
return res;
}
}
else if(op_type==OP_SELL)
{
double ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
if(m_sl_level>=0.0 && m_sl_level>ask)
{
MqlTradeRequest request={0};
request.action = TRADE_ACTION_PENDING;
request.symbol = Symbol();
request.volume = 1.0;
request.price=m_sl_level;
request.stoplimit=m_sl_level+(m_deviation*Point());
request.type=ORDER_TYPE_BUY_STOP_LIMIT;
request.type_filling=ORDER_FILLING_RETURN;
request.type_time=ORDER_TIME_DAY;
MqlTradeResult result;
bool res=OrderSend(request,result);
if(!res)
Print("Error set S/L. Reason: "+(string)GetLastError());
return res;
}
if(CharToStr(StringGetChar(data,strlen-1))=='.')
StringSetChar(data,strlen-1,'');
}
return false;
}



Помимо этих методов, код класса панели стал включать инициализацию и настройку соответствующего поля для ввода стоп-лосса.
Теперь, если нажать кнопку "BUY" или "SELL", а перед этим предварительно заполнить уровень "Stop Loss",
то вместе с новым рыночным ордером выставится специальный защитный ордер Buy Stop Limit или Sell Stop Limit
в зависимости от направления позиции.

Scripts_for_orders=21.zip

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

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

Тут был вопрос ответ на который нашелся в статье ТИПИЧНЫЕ ОШИБКИ В ПРОГРАММАХ НА MQL4 И МЕТОДЫ ИХ УСТРАНЕНИЯ Статья уже не раз помогла мне. Пользуйтесь на здоровье.

TMA_Fair_.mq4

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

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

Всем привет.

Снова у меня пробла с медленным тестированием сов.

Выше я уже писал, что сова из третьего урока "3 MQL программирование как написать советник на индикаторе", написанным мной тестировалась очень медленно.

4 часа ушло на тест с 15 по 16 год на 15минутках. Вместо пары минут, как на видео.

Я провел эксперимент, скачал с форума сову VelociGrid v2.05.
Загнал ее в тестер. 10 лет протестировал за 10 секунд.

Из чего я сделал вывод, что дело не в компьютере.

Следующее предположение, что сов на индикаторе ТМА, поэтому медленно тестит.

Я прошел 4 урок и написал код из него. Советник на мартине.
И он опять тупит на тесте.

Из чего я сделал предположение, что дело в коде.
Хотя все делал по уроку.

Гляньте плиз. Может у меня в коде очевидный БАГ, который я не вижу?

Или как вариант, скомпилируйте код и посмотрите сколько времени у вас тестится. Плииииз!

Вот код

Спойлер


//+------------------------------------------------------------------+
//| Martin.mq4 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link " "
#property version "1.00"
#property strict


extern double Lots = 0.01 ;
extern int TakeProfit = 50;
extern int Step = 60;
extern double Multiplier = 2;
extern int Magic = 123;
extern int Slippage = 3;
double tp, price, lastlot;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if (Digits == 3 || Digits == 5)
{
TakeProfit *= 10;
Step *= 10;
Slippage *= 10;

}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---

}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{

double ima = iMA(Symbol(), PERIOD_H1, 14, 0, MODE_SMA, PRICE_CLOSE, 1);


if (CountTrade() == 0)
{
if( Ask > ima)
{
tp= NormalizeDouble(Ask + TakeProfit*Point, Digits);
ticket= OrderSend( Symbol(), OP_BUY, Lots, Ask, 5, 0, tp, "", Magic, 0, Blue);
}
else
{
tp= NormalizeDouble(Bid - TakeProfit*Point, Digits);
ticket= OrderSend( Symbol(), OP_SELL, Lots, Ask, 5, 0, tp, "", Magic, 0, Red);
}
}
else
{
int order_type = FindLastOrderType();
if(order_type == OP_BUY)
{
price = FindLastOrderPrice(OP_BUY);
if (Ask {
lastlot = FindLastLots(OP_BUY);
lastlot = NormalizeDouble(lastlot*Multiplier, 2);
ticket = OrderSend(Symbol(), OP_BUY, lastlot, Ask, 5, 0, 0, "", Magic, 0, Blue);
if(ticket Print("Osibka otkr ord na pokyp");

ModifyOrders(OP_BUY);
}
}


if(order_type == OP_SELL)
{
price = FindLastOrderPrice(OP_SELL);
if (Bid >= price + Step*Point)
{
lastlot = FindLastLots(OP_SELL);
lastlot = NormalizeDouble(lastlot*Multiplier, 2);
ticket = OrderSend(Symbol(), OP_SELL, lastlot, Bid, 5, 0, 0, "", Magic, 0, Red);
if(ticket Print("Osibka otkr ord na prodajy");
ModifyOrders(OP_SELL);
}
}
}

}

//+------------------------------------------------------------------+
void ModifyOrders(int otype)
{
double avg_price, order_lots=0;
price = 0;

for( int i=OrdersTotal()-1; 1>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
price+= OrderOpenPrice()*OrderLots();
order_lots += OrderLots();
}
}
}
avg_price = NormalizeDouble(price / order_lots, Digits);

if (otype == OP_BUY) tp = NormalizeDouble(avg_price+ TakeProfit*Point, Digits);
if (otype == OP_SELL) tp = NormalizeDouble(avg_price - TakeProfit*Point, Digits);

for(int i= OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect( i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
if( OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0))
Print("Order modificirovan");
else Print("Oshibka modificii orderov");
}
}
}
}
//+------------------------------------------------------------------+
double FindLastLots(int otype)
{
int oldticket;
double oldprice=0;

ticket=0;


for( int ont = OrdersTotal()-1 ; ont >= 0 ; ont--)
{
if(OrderSelect(ont, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()== Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if(oldticket > ticket)
{
ticket = oldticket;
oldprice = OrderOpenPrice();
}
}

}
}
return(oldprice);
}


//+------------------------------------------------------------------+
double FindLastOrderPrice(int otype)
{
int oldticket;
double oldlots, oldprice=0;

ticket=0;


for( int ont = OrdersTotal()-1 ; ont>= 0 ; ont--)
{
if(OrderSelect(ont, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()== Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if(oldticket > ticket)
{
ticket = oldticket;
oldlots = OrderLots();
}
}

}
}
return(oldprice);
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
for(int i = OrdersTotal() - 1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()== Symbol() && OrderMagicNumber() == Magic)
return(OrderType());
}

}
return(-1);
}


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

}
return(count);
}


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

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



Кто-нибудь имеет хорошо написанный ассоциативный словарь? Так надоело все с 0 уже писать.

Поясни что это :d а то может имеешь такую ценность и не знаешь...

Вот примеры:
~https://msdn.microsoft.com/ru-ru/library/xfhwa508(v=vs.110).aspx
~http://www.cplusplus.com/reference/map/map/
Ссылка на сообщение
Поделиться на другие сайты

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




Кто-нибудь имеет хорошо написанный ассоциативный словарь? Так надоело все с 0 уже писать.

Поясни что это :d а то может имеешь такую ценность и не знаешь...

Вот примеры:
~https://msdn.microsoft.com/ru-ru/library/xfhwa508(v=vs.110).aspx
~http://www.cplusplus.com/reference/map/map/
Прости QJ, Вы профессионал. Здесь народ попроще и пока этой "штуки" не видел.

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

static datetime new_Bar = 0;
if (new_Bar == Time[0]) return; //Если бар не закрыт - выход
new_Bar = Time[0];

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

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


Я провел эксперимент, скачал с форума сову VelociGrid v2.05.
Загнал ее в тестер. 10 лет протестировал за 10 секунд.


Спасибо за комплимент. >):)
Ссылка на сообщение
Поделиться на другие сайты

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

Друзья, пытаюсь написать советник на трендовом индикаторе. В качестве экземпляра взял вот такой. Написал, пока условие, чтобы покупал, если цена ниже линии и продавал, когда выше линии. Торгует, но на цвет линии внимание не обращает. Может ли кто-то помочь, чтобы в условии было покупать только, если линия зеленая и продавать, только если линия красная. Мучаюсь и никак не получается. Вроде буферы на цвета линии 2 и 3. Спасибо огромное заранее!
//+------------------------------------------------------------------+
extern string perfora = " Настройки советника";
extern double Lots = 0.01;
extern int TakeProfit = 15;
extern int StopLoss = 30;
extern int Magic = 1234;
double priceliniaGREEN, priceliniaRED, TP,SL;

//+------------------------------------------------------------------+
extern string perfora1 = "Настройки индикатора beforexguru-2";
extern double Sensitivity = 38.0;
extern bool PopUp_Alert = TRUE;
extern bool Email_Alert = FALSE;

//+------------------------------------------------------------------+
void OnTick()
{
int ticket;
priceliniaGREEN = iCustom(NULL, 0, "beforexguru-2",Sensitivity, PopUp_Alert, Email_Alert, 2, 0);
priceliniaRED = iCustom(NULL, 0, "beforexguru-2",Sensitivity, PopUp_Alert, Email_Alert, 3, 0);

if(CountBuy() ==0 && Ask {
ticket = OrderSend( Symbol(), OP_BUY, Lots, Ask, 5, 0, 0, "", Magic, 0, Blue);
TP = NormalizeDouble( Ask + TakeProfit*Point, Digits);
SL = NormalizeDouble( Ask - StopLoss*Point, Digits);
if(OrderSelect(ticket,SELECT_BY_TICKET))
if(OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Ордер успешно модифицирован");
}
....

beforexguru-2.mq4

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
haiduc, у вас неправильная нумерация буферов. за прорисовку линий на графике отвечают беферы с нумерацией 1 и 2.
и неверный вызов iCustom. в перечислении вы не указали последнюю переменную с флагом extern типа string, у которой по умолчанию значение _имясайта.

неплохо выводить значения iCustom для себя в принт или коммент чтобы понимать с чем вобще работает код. ну эт так, совет к сведению.
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
erkon ты серьезно думаешь что кто-либо возьмется за то, что ты хочешь? ты сам пробовал перечитать своё полотно? первая мысль которая приходит когда прогер натыкается на такое - "да ну его наф! совсем псих? листаем дальше".

надо быть катастрофическим фатальным альтруистом мозга чтобы писать что-то по твоим ТЗ, да еще и на шару :d >:d
с твоими хотелками я советую тебе изучать хотя бы базовые аспекты mql4. месяц-два-полгода и ты сам уже будешь писать все что тебе надо. а так ты просто тупо тратишь своё время, имхо.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
haiduc когда Вы начнёте делать условие на Селл, то напишите Bid >= priceliniaRED. я сразу предупреждаю будет работать часто, почти на каждом баре, т.к. priceliniaRED = 0 когда priceliniaGREEN > 0. В условие нужно включить ещё одну проверку типа: ( Bid >= priceliniaRED && priceliniaRED > 0 )
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Могу написать ТЗ проще: >:d
- Просьба сделать индикатор, выводящий в окно маленькие кнопки,
при нажатии на которые срабатывают скрипты по управлению ордерами:

BUY, SELL, Close ALL, Close_BUY, Close_SELL

+ написать или переделать скрипты:
1. открытия по рынку ордеров BUY, SELL, (и BUY-Limit, SELL-Limit - опц.),
где вместо СЛ сразу выставлялся бы встречный Стоп-ордер Buy Stop, Sell Stop.
2. замены ранее выставленных в зоне убытка стоп-лосс(СЛ) ордеров на Стоп-ордера Buy-Stop, Sell-Stop - автоматически и/или с кнопкой "Замена стопов". Стоп-лосс(СЛ) ордера в зоне БУ+(прибыли) не должны заменяться.

Пример такого решения: Индикатор BDMhelperv1.06.mq4
к-й можно взять за основу и доработать.

Примеры готовых скриптов, индикатор и подробное ТЗ по частям возможным к реализации - в первых постах темы.
Включая готовые скрипты по выставлению ордеров BUY, SELL сразу со СЛ(стоп-лосс) и ТП(тейк-профит),
где выставление СЛ можно заменить на выставление стоп-ордеров: Buy Stop, Sell Stop.

Буду признателен за разработку.

----------
Спойлер


erkon ты серьезно думаешь что кто-либо возьмется за то, что ты хочешь? ты сам пробовал перечитать своё полотно? первая мысль которая приходит когда прогер натыкается на такое - "да ну его наф! совсем псих? листаем дальше".

надо быть катастрофическим фатальным альтруистом мозга чтобы писать что-то по твоим ТЗ, да еще и на шару :d >:d
с твоими хотелками я советую тебе изучать хотя бы базовые аспекты mql4. месяц-два-полгода и ты сам уже будешь писать все что тебе надо. а так ты просто тупо тратишь своё время, имхо.


Кто-то, недавно, в др. ветке писал, что надо по п.п. подробно расписывать ТЗ! ;)

Но я и сам это понимаю, многА букАфф ... однако. Старался! :">

---

Всё равно, признателен за отклик, вношу редакцию в ТЗ для более чёткого восприятия задачи сходу.

Про время ... так для себя составлять и прописывать ТЗ всё равно следует подробно же.
А так, да - и на эту проработку и часть времени ушло достаточно, и ещё тестировать же... :->


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

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

Помогу erkon с ТЗ для управляющего индюка:

- сделать индюк с 6 кнопками
- в настройках индюка для каждой кнопки 2 параметра
1. строка = название кнопки
2. символ = горячая клавиша для запуска скрипта.

Это всё.

Как пользоваться: у нас есть набор скриптов, выбираем 6 шт и назначаем им горячие клавиши в МТ. Затем запускаем индюк, настраиваем название кнопок и указываем символ горячей клавиши.

пример запуска скрипта из эксперта/индикатора.

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

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

Вопрос выставления стоп-ордеров: Buy Stop, Sell Stop вместо СЛ, при открытии ордера, сразу,
в скриптах по выставлению ордеров BUY, SELL
как-то м.б. решён?

И с созданием скрипта заменяющего к ордерам все уже имеющиеся в зоне убытка СЛ на стоп-ордера: Buy Stop, Sell Stop ?

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

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

Научите, Люди добрые, добавлять частичное закрытие и БУ в советники!

Столкнулась с проблемой и сломала мозг :

К примеру, ордер в Sell открывается от верхней линии ТМА и при пересечении средней линии должно произойти закрытие 50% лота и перестановка Стоплосса в БУ оставшейся части ордера. Остаток должен закрыться только на нижней линии либо по БУ.

Во всех тех примерах советников с открытым кодом, что я нашла, закрытие части и БУ есть только при достижении заданных пунктов. Мне оттуда "обрезанный" алгоритм не подходит, так как при пересечении ценой средней ТМА советник сначала закрывает одну часть ордера ... а потом другую - сразу же! Видимо, должна быть какая-то проверка, (и в сети говорят, что даже по Стоплоссу - раз он у нас изменился при переводе в БУ и "так удобно" числиться теперь у брокера), но воплотить это в код ума у меня не хватило.

Если у кого найдётся время (или из жалости и сострадания :(( ) "продемонстрируйте", пожалуйста, это мне на коде из урока "Обучение MQL", что в приложении. Там же и индикатор из урока, по которому советник написан.
(Как-то же надо новичкам учиться, а уроков и "образцов" нет :( )

В теме обучения не пишу, потому что мне и показать-то к исправлению нечего. Мне именно нужно доработать советник из урока :d

Всем, кто откликнется, буду очень признательна! Может кто и простой ссылочкой поможет :)

test_FP.mq4
TMA_Fair.mq4

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

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

я код не смотрел но ты права - должна быть проверка. ну... например, заведи интовый динамический массив.
при открытиии ордера увеличивай размерность массива на единицу и в последний элемент добавляй этот тикет этого ордера.
(OrderSend() возвращает именно ткет открываемого ордера)

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

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

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

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

Предложу алгоритм попроще.
1. Действительно по СЛ: есть сохранённое в отдельной переменной значение СЛ = СЛ1.
проверяем: если ( СЛордера == СЛ1 ) { переносим СЛ в БУ; закрываем 50%; }
таким образом исключаем повторное частичное закрытие.

2. То же только с лотом ордера = лот1:
проверяем: если ( Лотордера == лот1 ) { закрываем 50%; переносим СЛ в БУ; }

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

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

Спасибо большое за ответы. Зделал изменения в функци iCustom, но все равно торгует, не обращая внимание на цвет. Когда добавил дополнительное условие, ( Bid >= priceliniaRED && priceliniaRED > 0 ), то почему-то вообще стал открывать ордера бай и селл сразу. Или чего-то то не понял. Вроде бы без этого условия работает. Открывает только 1 ордер, в зависимоти от положения к линии.
Скажите пожалуйста, а можно ли функции iCustom придавать логическое значение и проверять, истинно или нет. Т.е. истина ли, что линия зеленая, а потом проверять на другие условия? Или как вообще в советниках реализуется принцип торговли строго вверх или строго вниз по индикатору. спасибо
P.S. вроде бы нашел нужное http://tlap.com/forum/ugolok-programmista/13/obuchenie-yazyku-mql4-pod-metatrader-4/4034
Вот кусок кода из подобного советника:
bufBuy = iCustom(NULL,0,"beforexguru_orig",Sensitivity, false, false,3,1);
bufSell = iCustom(NULL,0,"beforexguru_orig",Sensitivity, false, false,4,1);
if (bufBuy != EMPTY_VALUE) ordOpen(OP_BUY);
if (bufSell != EMPTY_VALUE) ordOpen(OP_SELL);
Стрелки в разных буферах. Значения в этих буферах либо пусто (EMPTY_VALUE) или цена где рисовать стрелку.

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
haiduc сове и индюку цвет линий до лампочки - главное номер буфера и значение в нём. Там, где Вы нашли решение, на след. странице есть моя сова для проверки стрелочных индюков, она подойдёт для проверки любых 2-х цветных индюков - надо только условия входа/выхода изменить.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Войти

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

Войти

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


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

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