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

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

#3601


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



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


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

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

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

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

#3604

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

#3605

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

#3606


Выясняете время закрытия ордера ( 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));
}

Изменено 2 июня, 2016 пользователем Alastar

#3607


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

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



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

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

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

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

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

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

#3610
Sergey Forex простое уравнение:
убыток_бай = прибыль_селл,
или лотБай * ( цБУ - цОткрБай ) * стоимПипс = лотСелл * ( цБУ - цОткрСелл ) * стоимПипс,
или цБУ = ( лотБай * цОткрБай - лотСелл * цОткрСелл ) / ( лотБай - лотСелл );
распиши на бумажке и внимательно проверь знаки.
#3611

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

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

Михаил.

2016-06-07_1.jpg

#3612
mischkus не хватает точки с запятой в самом конце 17й строки.
#3613

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

#3614


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

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


разве? ProTrader не на mql создан?
#3615



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

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

Подскажите пожалуйста ошибку трейлинга,
в журнале пишет на продажу" ордер модифи 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());
}
}

}
}
}
}
}
#3617

блин сколько раз уже говорилось, никогда не сравнивай дабловые переменные!!! это ересь и БОХНАКАЖЕТ!!!!! ~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);
}



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

Изменено 10 июня, 2016 пользователем dermitay

#3618

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

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

И силы тьмы окутали ученика, хотя сам мастер из мастеров, кодокрушитель, создатель армий себе подобных, непревзойденный учитель света (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, тогда ошибка исчезнет.
И работает всетаки, изменил по вашему, ошибка не исчезла.
Спасибо, может кому пригодится.

Изменено 11 июня, 2016 пользователем vitek01

#3620

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

Спойлер

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.rar6 скач.

#3621


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

Спойлер

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_.mq42 скач.
TMAEA.mq43 скач.

#3622

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

Спойлер



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

Спойлер

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);
}
//+------------------------------------------------------------------+



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

Очередной вопрос к Сергею по урокам программированию 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

Изменено 15 июня, 2016 пользователем mischkus

#3624
Спойлер


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

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


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



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



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

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

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

Martin.mq411 скач.

#3625

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

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

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