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

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


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

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


1. Подключаете индикатор к сове через iCustom
2. Опрашиваете его с некой периодичностью
3. если значение индикатора станет соответствовать Вашим условиям - открываете ордер



Спасибо большое!!!! вот только как задать эту периодичность???
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Перейти

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

Перейти

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

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


Спасибо большое!!!! вот только как задать эту периодичность???

функция ОнТик() запускается на каждом тике - это довольно часто, если Вы хотите получать значения индикатора с 1 бара, то Вам нужна функция по определению закрытия 0-бара ( здесь не раз выкладывалась ). если Вы планируете использовать значения индикатора с 0-бара, то можно на каждом тике или ожидать прохода ценой некой дистанции.
Ссылка на сообщение
Поделиться на другие сайты

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

Уважаемые кодеры! Не могли бы в следующих обучающих видео рассмотреть интерактивные вопросы: кнопки, окна и т.д.

К примеру, создать кнопку для активации скрипта. Это эффективнее и быстрее, чем в навигаторе активировать.

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

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

Сабж. Как проверить свечу, где уже был получен Тейк Профит? Самый быстрый, примитивный и надежный способ кто-нибудь знает? Главное что бы не загромождать код и не нагружать систему.

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

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

Выясняете время закрытия ордера ( OrderCloseTime() ), потом номер свечи, содержащей это время ( iBarShift() ) и по номеру проверяете всё что хотите.

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

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


Выясняете время закрытия ордера ( OrderCloseTime() ), потом номер свечи, содержащей это время ( iBarShift() ) и по номеру проверяете всё что хотите.


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

Добавлено: 02-06-2016 18:58:08

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


//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru/ |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Возвращает номер бара закрытия последней позиции или -1. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" или NULL - текущий символ) |
//| tf - таймфрейм ( 0 - текущий таймфрейм) |
//| op - операция ( -1 - любая позиция) |
//| mn - MagicNumber ( -1 - любой магик) |
int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1)
{
datetime t;
int i, k=OrdersHistoryTotal();

if (sy=="" || sy=="0") sy=Symbol();
for (i=0; i {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol()==sy)
{
if (OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if (op {
if (mn {
if (t }
}
}
}
}
}
return(iBarShift(sy, tf, t, True));
}
Изменено пользователем Alastar
Ссылка на сообщение
Поделиться на другие сайты

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


Уважаемые кодеры! Не могли бы в следующих обучающих видео рассмотреть интерактивные вопросы: кнопки, окна и т.д.

К примеру, создать кнопку для активации скрипта. Это эффективнее и быстрее, чем в навигаторе активировать.



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

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

К примеру, создать кнопку для активации скрипта.

Это немного выходит за рамки МКЛ.
Ссылка на сообщение
Поделиться на другие сайты

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

Уважаемые программисты!

Ситуация: бот открывает ордер бай. Цена идет против нас и через определенное количество пунктов, бот открывает противоположный ордер селл с удвоенным лотом.

Подскажите как рассчитать СЛ и ТП, чтобы закрыться в безубыток + n пунктов?
То есть для удвоенного ордера надо рассчитать ТП, а для первого, который в убытке, надо рассчитать СЛ, чтобы суммарно выйти в безубыток.
Заранее благодарю.

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Sergey Forex простое уравнение:
убыток_бай = прибыль_селл,
или лотБай * ( цБУ - цОткрБай ) * стоимПипс = лотСелл * ( цБУ - цОткрСелл ) * стоимПипс,
или цБУ = ( лотБай * цОткрБай - лотСелл * цОткрСелл ) / ( лотБай - лотСелл );
распиши на бумажке и внимательно проверь знаки.
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Вопрос к Сергею по урокам программированию MQL.

К третьему уроку по программированию "Как написать советник" Вы не даете готовых кодов советника на индикаторе TMA Fair. И это правильно: новичку наколотить код советника потребуется не один день, зато создается ощущение приобщенности к великому.
Я буква в букву повторил все коды этого советника и наткнулся на глупейшую ошибку, которой в самом начале и быть-то не должно, потому что были скопированы данные самого индикатора TMA Fair (см. прилож.), почему я и обращаюсь за помощью к Сергею помочь убрать эту ошибку. В начале всегда трудно.

Михаил.

2016-06-07_1.jpg

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

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

dermitau, большое спасибо. Мелочь, а не видна.

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

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


К примеру, создать кнопку для активации скрипта.

Это немного выходит за рамки МКЛ.


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

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



К примеру, создать кнопку для активации скрипта.

Это немного выходит за рамки МКЛ.
разве? ProTrader не на mql создан?
Для активации скрипта нужно отправить активному окну коды горячих клавиш. это делается через АПИ виндовс, т.е. программа на МКЛ вызывает библиотеку виндовс и её использует, согласитесь этот приём не может быть отнесён к МКЛ, ибо там бездна возможностей, всего не опишешь...
В любом случае примеры кода есть и Вы всегда можете самостоятельно изучить и использовать.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Подскажите пожалуйста ошибку трейлинга,
в журнале пишет на продажу" ордер модифи 130" - неправильные стопы , проверял, но так и не понял . На покупку все вроде нормально?

//+------------------------------------------------------------------+
void Trailing()
{
for(int i =0; i {
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY)
{
if(Bid-OrderOpenPrice() >tr_stop*Point)
{
if(OrderStopLoss() {
SL=NormalizeDouble(OrderStopLoss()+tr_step*Point,Digits);
if(OrderStopLoss()!=SL)
{
if(OrderModify(OrderTicket(),Bid,SL,0,0,0)==true)
Print("Ордер на покупку по трейлинг стопу успешно модифицирован");
else
Print("Ордер на покупку не модифицирован, код ошибки",GetLastError());
}

}
}
}
if(OrderType()==OP_SELL)
{
if(OrderOpenPrice()-Ask>tr_stop*Point)
{
if(OrderStopLoss()>Ask+(tr_stop+tr_step+sl)*Point)
SL=NormalizeDouble(OrderStopLoss()-tr_step*Point,Digits);
if(OrderStopLoss()!=SL)
{
if(OrderModify(OrderTicket(),Ask,SL,0,0,0)==true)
Print("ордер на продажу по трейлинг стопу успешно модифицирован");
else
Print("Ордер на продажу не модифицирован, код ошибки",GetLastError());
}
}

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

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

блин сколько раз уже говорилось, никогда не сравнивай дабловые переменные!!! это ересь и БОХНАКАЖЕТ!!!!! ~x( ~x( ~x(

я уже даже писал с какго хера это происходит на нулеовм-процессорном уровне, один фиг не помогает...

за это тьмы сила тебя поглотит

if(OrderStopLoss()!=SL)


юзай вот это вместо "!=" при сравнении стоплоссов и с миром юный падаван уходи.

Спойлер


bool GD(double number1,double number2,int dig)
{
if(NormalizeDouble(MathAbs(number1-number2),dig)>0)
return(true);
else return(false);
}



надеюсь, ферштейн? либо юзай описанную выше булевую функцию либо делай в коде разницу между переменными и задавай точность сравнения. хотя это тоже самое что и выше, только тут красивее решение Изменено пользователем dermitay
  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

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

Я обычно так сравниваю ( если, конечно, не мультивалютная сова ) :
вместо if ( OrderStopLoss() != SL )
if ( MathAbs( OrderStopLoss() - SL ) >= _Point )

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
за это тьмы сила тебя поглотит

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

Добавлено: 10-06-2016 14:55:13


блин сколько раз уже говорилось, никогда не сравнивай дабловые переменные!!! это ересь и БОХНАКАЖЕТ!!!!!

Может создать тему для юных програмистов самых грубых(или не очень) ошибок кодостроения, которые существенно могут влиять на работу советника, чтобы делать качественные экперты? А то заколебалось уже узнавать все в последнюю очередь. Думаю нам есть чему поучится у опытных прогеров MQL4!

Добавлено: 11-06-2016 06:20:16


Подскажите пожалуйста ошибку трейлинга,
в журнале пишет на продажу" ордер модифи 130" - неправильные стопы , проверял, но так и не понял . На покупку все вроде нормально?

//+------------------------------------------------------------------+
void Trailing()
{
for(int i =0; i {
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY)
{
if(Bid-OrderOpenPrice() >tr_stop*Point)
{
if(OrderStopLoss() {
SL=NormalizeDouble(OrderStopLoss()+tr_step*Point,Digits);
if(OrderStopLoss()!=SL)
{
if(OrderModify(OrderTicket(),Bid,SL,0,0,0)==true)
Print("Ордер на покупку по трейлинг стопу успешно модифицирован");
else
Print("Ордер на покупку не модифицирован, код ошибки",GetLastError());
}

}
}
}
if(OrderType()==OP_SELL)
{
if(OrderOpenPrice()-Ask>tr_stop*Point)
{
if(OrderStopLoss()>Ask+(tr_stop+tr_step+sl)*Point)
SL=NormalizeDouble(OrderStopLoss()-tr_step*Point,Digits);
if(OrderStopLoss()!=SL)
{
if(OrderModify(OrderTicket(),Ask,SL,0,0,0)==true)
Print("ордер на продажу по трейлинг стопу успешно модифицирован");
else
Print("Ордер на продажу не модифицирован, код ошибки",GetLastError());
}
}

}
}
}
}
}



Нашел ошибку в трейлинге. SL заявлена как глобальная переменная, и в трейлинге используется как на продажу, так и на покупку, переписывая ее при модификаций, отсюда и вся путаница. Если есть открытые ордера на продажу и покупку, то где то, что то запутается, отсюда и ошибка 130(неправильные стопы). Нужно всего лишь в трейлинге изменить переменную, например на продажу, SL_1, тогда ошибка исчезнет.
И работает всетаки, изменил по вашему, ошибка не исчезла.
Спасибо, может кому пригодится.
Изменено пользователем vitek01
  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

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

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

Спойлер

extern double Lots = 0.01;
extern double StopLoss = 0;
extern double TakeProfit = 5;
extern int Slippage = 3;
extern int Magic = 101010;

extern string Martin = "Настройка мартина";
extern int Step = 15;
extern double Multipler = 2.0;

extern string TMATrend = "Настройка TMA";
extern string TimeFrame = "current time frame";
extern int HalfLength = 56;
extern double ATRMultiplier = 2.0;
extern int ATRPeriod = 100;
extern bool Interpolate = true;
extern int Shift = 5;

double SL, TP, PriceHight, PriceLow, Trend, CenterLine, Price, Lastlot;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{

if(Digits == 3 || Digits == 5)
{
TakeProfit *= 10;
StopLoss *= 10;
Slippage *= 10;
Step *= 10;
}

return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{ //--------------------------------------------------------
double PriceHight = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,1,1);
PriceLow = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,2,1);
double Trend = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,1,Shift);
//--------------------------------------------------------

if (CountTrade() == 0)
{
if (Bid >= PriceHight && Trend >= PriceHight)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "1-й ордер на продажу", Magic, 0, Red);
TP = NormalizeDouble (Bid - TakeProfit * Point, Digits);
}
if (Ask {
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "1-й ордер на покупку", Magic, 0, Blue);
TP = NormalizeDouble (Ask + TakeProfit * Point, Digits);
}
}
else
{
int order_type = FindLastOrderType();
if (order_type = OP_BUY)
{
Price = FindLastOrderPrice(OP_BUY);
if (Ask {
Lastlot = FindLastLots (OP_BUY);
Lastlot = NormalizeDouble (Lastlot * Multipler, 2);
ticket = OrderSend(Symbol(), OP_BUY, Lastlot, Ask, Slippage, 0, 0, 0, Magic, 0, Blue);
if (ticket Print("Ошибка открытия ордера на покупку");
ModifyOrders(OP_BUY);
}

}
if (order_type = OP_SELL)
{
Price = FindLastOrderPrice(OP_SELL);
if (Bid >= Price + Step*Point)
{
Lastlot = FindLastLots (OP_SELL);
Lastlot = NormalizeDouble (Lastlot * Multipler, 2);
ticket = OrderSend(Symbol(), OP_SELL, Lastlot, Bid, Slippage, 0, 0, 0, Magic, 0, Red);
if (ticket Print("Ошибка открытия ордера на продажу");
ModifyOrders(OP_SELL);
}

}
}
}
//+------------------------------------------------------------------+
void ModifyOrders(int otype)
{
double avg_price, order_lots=0;
Price = 0;
for (int i = OrdersTotal()-1; i >=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 j = OrdersTotal()-1; j >=0; j--)
{
if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, TP, 0))
Print("Ордера успешно модифицированы");
else Print ("Ошибка при модифицировании ордеров");

}
}
}
}
//+------------------------------------------------------------------+
double FindLastLots (int otype)
{
int oldticket;
double oldlots=0;
ticket=0;
for (int cnt = OrdersTotal()-1; cnt >=0; cnt--)
{
if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if(oldticket > ticket)
{
ticket = oldticket;
oldlots = OrderLots();
}
}
}
return(oldlots);
}
}
//+------------------------------------------------------------------+
double FindLastOrderPrice(int otype)
{
int oldticket;
double oldopenprice=0;
ticket=0;
for (int cnt = OrdersTotal()-1; cnt >=0; cnt--)
{
if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if(oldticket > ticket)
{
ticket = oldticket;
oldopenprice = OrderOpenPrice();
}
}
}
return(oldopenprice);
}
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
for (int trade = OrdersTotal()-1; trade >=0; trade--)
{
if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
return (OrderType());
}
}
return(-1);
}
//+------------------------------------------------------------------+
int CountTrade()
{
int count = 0;
for (int trade = OrdersTotal()-1; trade >=0; trade--)
{
if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
count++;
}
}
return (count);
}
//+------------------------------------------------------------------+

Советник+индикаторTMAEA+TMAFair.rar

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

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


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

Спойлер

extern double Lots = 0.01;
extern double StopLoss = 0;
extern double TakeProfit = 5;
extern int Slippage = 3;
extern int Magic = 101010;

extern string Martin = "Настройка мартина";
extern int Step = 15;
extern double Multipler = 2.0;

extern string TMATrend = "Настройка TMA";
extern string TimeFrame = "current time frame";
extern int HalfLength = 56;
extern double ATRMultiplier = 2.0;
extern int ATRPeriod = 100;
extern bool Interpolate = true;
extern int Shift = 5;

double SL, TP, PriceHight, PriceLow, Trend, CenterLine, Price, Lastlot;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{

if(Digits == 3 || Digits == 5)
{
TakeProfit *= 10;
StopLoss *= 10;
Slippage *= 10;
Step *= 10;
}

return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{ //--------------------------------------------------------
double PriceHight = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,1,1);
PriceLow = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,2,1);
double Trend = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,1,Shift);
//--------------------------------------------------------

if (CountTrade() == 0)
{
if (Bid >= PriceHight && Trend >= PriceHight)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "1-й ордер на продажу", Magic, 0, Red);
TP = NormalizeDouble (Bid - TakeProfit * Point, Digits);
}
if (Ask {
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "1-й ордер на покупку", Magic, 0, Blue);
TP = NormalizeDouble (Ask + TakeProfit * Point, Digits);
}
}
else
{
int order_type = FindLastOrderType();
if (order_type = OP_BUY)
{
Price = FindLastOrderPrice(OP_BUY);
if (Ask {
Lastlot = FindLastLots (OP_BUY);
Lastlot = NormalizeDouble (Lastlot * Multipler, 2);
ticket = OrderSend(Symbol(), OP_BUY, Lastlot, Ask, Slippage, 0, 0, 0, Magic, 0, Blue);
if (ticket Print("Ошибка открытия ордера на покупку");
ModifyOrders(OP_BUY);
}

}
if (order_type = OP_SELL)
{
Price = FindLastOrderPrice(OP_SELL);
if (Bid >= Price + Step*Point)
{
Lastlot = FindLastLots (OP_SELL);
Lastlot = NormalizeDouble (Lastlot * Multipler, 2);
ticket = OrderSend(Symbol(), OP_SELL, Lastlot, Bid, Slippage, 0, 0, 0, Magic, 0, Red);
if (ticket Print("Ошибка открытия ордера на продажу");
ModifyOrders(OP_SELL);
}

}
}
}
//+------------------------------------------------------------------+
void ModifyOrders(int otype)
{
double avg_price, order_lots=0;
Price = 0;
for (int i = OrdersTotal()-1; i >=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 j = OrdersTotal()-1; j >=0; j--)
{
if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, TP, 0))
Print("Ордера успешно модифицированы");
else Print ("Ошибка при модифицировании ордеров");

}
}
}
}
//+------------------------------------------------------------------+
double FindLastLots (int otype)
{
int oldticket;
double oldlots=0;
ticket=0;
for (int cnt = OrdersTotal()-1; cnt >=0; cnt--)
{
if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if(oldticket > ticket)
{
ticket = oldticket;
oldlots = OrderLots();
}
}
}
return(oldlots);
}
}
//+------------------------------------------------------------------+
double FindLastOrderPrice(int otype)
{
int oldticket;
double oldopenprice=0;
ticket=0;
for (int cnt = OrdersTotal()-1; cnt >=0; cnt--)
{
if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if(oldticket > ticket)
{
ticket = oldticket;
oldopenprice = OrderOpenPrice();
}
}
}
return(oldopenprice);
}
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
for (int trade = OrdersTotal()-1; trade >=0; trade--)
{
if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
return (OrderType());
}
}
return(-1);
}
//+------------------------------------------------------------------+
int CountTrade()
{
int count = 0;
for (int trade = OrdersTotal()-1; trade >=0; trade--)
{
if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
count++;
}
}
return (count);
}
//+------------------------------------------------------------------+




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

TMA_Fair_.mq4
TMAEA.mq4

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

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

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

Спойлер



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

Спойлер

extern double Lots            = 0.01;
extern double StopLoss = 0;
extern double TakeProfit = 5;
extern int Slippage = 3;
extern int Magic = 101010;

extern string Martin = "Настройка мартина";
extern int Step = 15;
extern double Multipler = 2.0;

extern string TMATrend = "Настройка TMA";
extern string TimeFrame = "current time frame";
extern int HalfLength = 56;
extern double ATRMultiplier = 2.0;
extern int ATRPeriod = 100;
extern bool Interpolate = true;
extern int Shift = 5;

double SL, TP, PriceHight, PriceLow, Trend, CenterLine, Price, Lastlot;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{

if(Digits == 3 || Digits == 5)
{
TakeProfit *= 10;
StopLoss *= 10;
Slippage *= 10;
Step *= 10;
}

return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{ //--------------------------------------------------------
double PriceHight = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,1,1);
PriceLow = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,2,1);
double Trend = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,1,Shift);
//--------------------------------------------------------

if (CountTrade() == 0)
{
if (Bid >= PriceHight && Trend >= PriceHight)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "1-й ордер на продажу", Magic, 0, Red);
TP = NormalizeDouble (Bid - TakeProfit * Point, Digits);
}
if (Ask {
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "1-й ордер на покупку", Magic, 0, Blue);
TP = NormalizeDouble (Ask + TakeProfit * Point, Digits);
}
}
else
{
int order_type = FindLastOrderType();
if (order_type = OP_BUY)
{
Price = FindLastOrderPrice(OP_BUY);
if (Ask {
Lastlot = FindLastLots (OP_BUY);
Lastlot = NormalizeDouble (Lastlot * Multipler, 2);
ticket = OrderSend(Symbol(), OP_BUY, Lastlot, Ask, Slippage, 0, 0, 0, Magic, 0, Blue);
if (ticket Print("Ошибка открытия ордера на покупку");
ModifyOrders(OP_BUY);
}

}
if (order_type = OP_SELL)
{
Price = FindLastOrderPrice(OP_SELL);
if (Bid >= Price + Step*Point)
{
Lastlot = FindLastLots (OP_SELL);
Lastlot = NormalizeDouble (Lastlot * Multipler, 2);
ticket = OrderSend(Symbol(), OP_SELL, Lastlot, Bid, Slippage, 0, 0, 0, Magic, 0, Red);
if (ticket Print("Ошибка открытия ордера на продажу");
ModifyOrders(OP_SELL);
}

}
}
}
//+------------------------------------------------------------------+
void ModifyOrders(int otype)
{
double avg_price, order_lots=0;
Price = 0;
for (int i = OrdersTotal()-1; i >=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 j = OrdersTotal()-1; j >=0; j--)
{
if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, TP, 0))
Print("Ордера успешно модифицированы");
else Print ("Ошибка при модифицировании ордеров");

}
}
}
}
//+------------------------------------------------------------------+
double FindLastLots (int otype)
{
int oldticket;
double oldlots=0;
ticket=0;
for (int cnt = OrdersTotal()-1; cnt >=0; cnt--)
{
if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if(oldticket > ticket)
{
ticket = oldticket;
oldlots = OrderLots();
}
}
}
return(oldlots);
}
}
//+------------------------------------------------------------------+
double FindLastOrderPrice(int otype)
{
int oldticket;
double oldopenprice=0;
ticket=0;
for (int cnt = OrdersTotal()-1; cnt >=0; cnt--)
{
if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if(oldticket > ticket)
{
ticket = oldticket;
oldopenprice = OrderOpenPrice();
}
}
}
return(oldopenprice);
}
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
for (int trade = OrdersTotal()-1; trade >=0; trade--)
{
if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
return (OrderType());
}
}
return(-1);
}
//+------------------------------------------------------------------+
int CountTrade()
{
int count = 0;
for (int trade = OrdersTotal()-1; trade >=0; trade--)
{
if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
count++;
}
}
return (count);
}
//+------------------------------------------------------------------+



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

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

Очередной вопрос к Сергею по урокам программированию MQL: "Программирование советника на мартингейле".

Как всегда, буква в букву два дня смотрел и переписывал урок по мартину.
Ошибок и некритических замечаний не получил.
По итогу: управления от iMa нет (включал/выключал - нет), работают только покупки под "машкой", мультипликатор (сам мартин) не работает - лотность одна и та же.


Добавлено: 15-06-2016 16:40:43



Добавлено: 15-06-2016 16:41:09



Добавлено: 15-06-2016 16:41:41

Да, в журнале ошибок чисто. Аттачу (см. выше)

Martin_1.jpg
Martin_2.jpg
Martin_3.jpg

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

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


Очередной вопрос к Сергею по урокам программированию MQL: "Программирование советника на мартингейле".

Как всегда, буква в букву два дня смотрел и переписывал урок по мартину.
Ошибок и некритических замечаний не получил.
По итогу: управления от iMa нет (включал/выключал - нет), работают только покупки под "машкой", мультипликатор (сам мартин) не работает - лотность одна и та же.


Добавлено: 15-06-2016 16:40:43



Добавлено: 15-06-2016 16:41:09



Добавлено: 15-06-2016 16:41:41

Да, в журнале ошибок чисто. Аттачу (см. выше)

Снизу прикрепил советник работает как в уроке. Спасибо Сергею за его уроки по MQL, теперь для себя пишу советники :d

Martin.mq4

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

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

Столкнулся с такой проблемой, если
if(Close[1]>High[2]) // if(iClose[(1.00001)]>High[(1.00001)])
{
------
}else
if(Close[1][(1.00001)][(1.00001)])
{
-------
}
Как сравнить более точно если так получилось что клозе и не больше и не меньше хайя?

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

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

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

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

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

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

Войти

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

Войти

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


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

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