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

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

#676

Уважаемый xbms,подскажите пожалуйста в чем дело.Хочу привязать индикатор ТМА из торговой системы Extreme TMA System
Индикатор имеет входные параметры :
extern string TimeFrame = "Current";
extern int TMAPeriod = 56;
extern int Price = PRICE_CLOSE;
extern double ATRMultiplier = 2.0;
extern int ATRPeriod = 100;
extern double TrendThreshold = 0.5;
extern bool ShowCenterLine = false;
вызываю функцией
if(Close[1]>iCustom(NULL,0,"Extreme TMALine",TimeFrame,TMAPeriod,Price,ATRMultiplier,ATRPeriod,TrendThreshold,3,1))
{ открытие позиции бай
}
но он не отрисовывается в тестере,условие не выполняется.
Не могу понять в чем тут дело,будьте добры подскажите пожалуйста.Ниже прикреплен сам индикатор.


Добавлено: 29-01-2014 13:13:51


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


Добавлено: 27-01-2014 18:40:10

Господа профи,окажите услугу посмотрите кусочек кода правильно я указал условия входа получается из 3 индикаторов.

E_ma=iMA(Symbol(),TimeFrame,period_ema,0,MODE_EMA,PRICE_CLOSE,1);
Vhod=iClose(Symbol(),PERIOD_H1,1);

e_ma=iMA(Symbol(),timeframe,period_ema,0,MODE_EMA,PRICE_CLOSE,1);
vhod=iClose(Symbol(),PERIOD_M15,1);

bbUP=iCustom(Symbol(),PERIOD_M5,"Bollinger Bands",BandsPeriod,BandsShift,BandsDeviations,1,0);
bbDOWN=iCustom(Symbol(),PERIOD_M5,"Bollinger Bands",BandsPeriod,BandsShift,BandsDeviations,2,0);

if(OrdersTotal()==0 && CountBuy()==0 && CountSell())
{
if(Vhod>E_ma && vhod>e_ma)
{
if(Ask ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Green);
if(ticket>0)
{
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);
SL = NormalizeDouble(Ask-StopLoss* Point, Digits);
OrderModify(ticket, OrderOpenPrice(), SL, TP, 0);
}
}
else
if(Vhod {
if(Bid>=bbUP)
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red);
if(ticket>0)
{
TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);
SL = NormalizeDouble(Bid+StopLoss* Point, Digits);
OrderModify(ticket, OrderOpenPrice(), SL, TP, 0);
}
}
}


return(0);

Поправьте меня если чего не правильно,компилирует без ошибок,а вот в тесторе ордера не открывает .Потому как где то ошибка в условии.Как правильно написать,я не пойму пока.кто нить на пальцах поясните ПЛИИЗ !!!

У тебя условие не выполняется,ты хочешь открыть БАЙ если свеча на предыдущем баре закрылась выше МА на М15 и Н1 тамфреймах и пишешь при этом условие болинджера что цена меньше нижней линии(тут либо стрелку разворачивай либо линию меняй на верхнюю,не знаю как уж там по условиям твоей торговой системы) .
Много пишешь лишнего можно проще гораздо и все 3 условия можно вписать в 1 строку
If( Close[1]>iMA(Symbol(),timeframe,period_ema,0,MODE_EMA,PRICE_CLOSE,1) &&
Close[1]> iMA(Symbol(),TimeFrame,period_ema,0,MODE_EMA,PRICE_CLOSE,1) &&
Ask {......открытие позиции и бла бла
}
вообщем с болиджером подумай как там у тебя согласно системе :d

ExtremeTMALine.mq410 скач.

Изменено 29 января, 2014 пользователем AndreyP

#677

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

void OnTick()
{
if(TerminalCompany())
Comment(TerminalCompany());

CloseOrders();
E_ma=iMA(Symbol(),Time_Freime,Period_Ema,0,MODE_EMA,PRICE_CLOSE,1);
e_ma=iMA(Symbol(),time_freime,period_ema,0,MODE_EMA,PRICE_CLOSE,1);
bbUP=iCustom(Symbol(),PERIOD_M5,"BolendjerBar",BandsPeriod,BandsShift,BandsDeviations,1,0);
bbDWN=iCustom(Symbol(),PERIOD_M5,"BolendjerBar",BandsPeriod,BandsShift,BandsDeviations,2,0);

if(OrdersTotal() ==0 && CountBuy() == 0 && CountSell()== 0)
{

if(Ask>=E_ma && Ask >= e_ma && Ask ticket=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,Slippage,0,0,"",Magic,LawnGreen);
if(ticket>0)
{
SL=NormalizeDouble(OrderOpenPrice()-StopLoss * Point,Digits );
TP=NormalizeDouble(OrderOpenPrice()+TakeProfit * Point,Digits );
OrderModify(ticket,OrderOpenPrice(),SL,TP,0,Yellow);
}
if(Bid=bbUP)
ticket=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,Slippage,0,0,"",Magic,0,DeepPink);
if(ticket>0)
{
SL=NormalizeDouble(OrderOpenPrice()+StopLoss * Point,Digits );
TP=NormalizeDouble(OrderOpenPrice()-TakeProfit * Point,Digits);
OrderModify(ticket,OrderOpenPrice(),SL,TP,0,Yellow);
}
}
}

#678


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

void OnTick()
{
if(TerminalCompany())
Comment(TerminalCompany());

CloseOrders();
E_ma=iMA(Symbol(),Time_Freime,Period_Ema,0,MODE_EMA,PRICE_CLOSE,1);
e_ma=iMA(Symbol(),time_freime,period_ema,0,MODE_EMA,PRICE_CLOSE,1);
bbUP=iCustom(Symbol(),PERIOD_M5,"BolendjerBar",BandsPeriod,BandsShift,BandsDeviations,1,0);
bbDWN=iCustom(Symbol(),PERIOD_M5,"BolendjerBar",BandsPeriod,BandsShift,BandsDeviations,2,0);

if(OrdersTotal() ==0 && CountBuy() == 0 && CountSell()== 0)
{

if(Ask>=E_ma && Ask >= e_ma && Ask ticket=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,Slippage,0,0,"",Magic,LawnGreen);
if(ticket>0)
{
SL=NormalizeDouble(OrderOpenPrice()-StopLoss * Point,Digits );
TP=NormalizeDouble(OrderOpenPrice()+TakeProfit * Point,Digits );
OrderModify(ticket,OrderOpenPrice(),SL,TP,0,Yellow);
}
if(Bid=bbUP)
ticket=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,Slippage,0,0,"",Magic,0,DeepPink);
if(ticket>0)
{
SL=NormalizeDouble(OrderOpenPrice()+StopLoss * Point,Digits );
TP=NormalizeDouble(OrderOpenPrice()-TakeProfit * Point,Digits);
OrderModify(ticket,OrderOpenPrice(),SL,TP,0,Yellow);
}
}
}


тогда нужно писать что что аск изменила свое положение относительно боленджера,то есть либо сначала была меньше потом стала больше
тебе надо дописать еще 1 условие ,либо изменилось расстояние. Тут у тебя еще непонятная функция void OnTick() и ты получается все в нее прописал,это не есть хорошо ,пропиши по человечески в старт .

Изменено 29 января, 2014 пользователем AndreyP

#679

Спасибо буду думать.
Ребята подскажите как мне сделать? Есть функция автоматического расчета лота.
Она прописывается в параметр лот в ордер сенд,так вот хотел сделать так чтоб
true- торгуем с автоматическим расчетом лота, false-торгуем фиксированным лотом ?

#680


Спасибо буду думать.
Ребята подскажите как мне сделать? Есть функция автоматического расчета лота.
Она прописывается в параметр лот в ордер сенд,так вот хотел сделать так чтоб
true- торгуем с автоматическим расчетом лота, false-торгуем фиксированным лотом ?


Вот тебе готовую ,юзай на здоровье:
extern double Lot = 0.1, //если Lot=0, то лот расчитывается от свободных средств
risk = 10; //процент свободных средств для расчета плавающего ордера
double LOT()
{
if (Lot!=0) return(Lot);
double MINLOT = MarketInfo(Symbol(),MODE_MINLOT);
double LOT = AccountFreeMargin()*risk/100/MarketInfo(Symbol(),MODE_MARGINREQUIRED);
if (LOT>MarketInfo(Symbol(),MODE_MAXLOT)) LOT = MarketInfo(Symbol(),MODE_MAXLOT);
if (LOT if (MINLOT return(LOT);
}
как применить надеюсь догадаешься :d

Изменено 29 января, 2014 пользователем AndreyP

#681

Спасибо конечно,но у мня есть такая. То же готовая:

extern double MaximumRisk = 0.03;
extern double DecreaseFactor = 3.0;
extern string ___ = " Шаг Баланса";
extern double balans = 500;

double LotsOptimized() {
double minlot = MarketInfo(Symbol(), MODE_MINLOT);
double maxlot = MarketInfo(Symbol(), MODE_MAXLOT);
double lot = Lots;
int orders = OrdersHistoryTotal();
int losses = 0;
lot = NormalizeDouble(AccountFreeMargin() * MaximumRisk / balans, 2);
if (DecreaseFactor > 0.0) {
for (int i = orders - 1; i >= 0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == FALSE) {
Print("Error in history!");
break;
}
if (OrderSymbol() != Symbol() || OrderType() > OP_SELL) continue;
if (OrderProfit() > 0.0) break;
if (OrderProfit() }
if (losses > 1) lot = NormalizeDouble(lot - lot * losses / DecreaseFactor, 2);
}
if(lot if(lot > maxlot) lot = maxlot;
return (lot);}

мне надо либо включить ее,либо выключить.

#682

Не хочу ругаться, но меня уже начинает немного бесить, когда открываешь страничку этой темы а там всего 3-4 сообщения, которые занимают по 2-3 скролла экрана. Уважайте других, добавляйте код либо под спойлер, либо как и положено в код.

Спойлер

спойлер


код

Спасибо за понимание.
#683
Спойлер



Хорошо учтем !

Добавлено: 29-01-2014 19:15:32

Спойлер

[/хорошо будем учитывать]


Добавлено: 30-01-2014 10:17:32


Спасибо буду думать.
Ребята подскажите как мне сделать? Есть функция автоматического расчета лота.
Она прописывается в параметр лот в ордер сенд,так вот хотел сделать так чтоб
true- торгуем с автоматическим расчетом лота, false-торгуем фиксированным лотом ?



Я бы прописал,но установился терминал МТ4 builid последней версии . В нем так,запихиваю в 509 выдает кучу ошибок,с 509 в обратно то же самое.Как с ними работать вообще разобраться не могу.зато на тесторе в последнем все работает,хотел попробовать на демке пока не получилось.Почему то на впс устанавливается 509. а эта функция из MQL5 хотя последний терминал устанавливал МТ4 вообще не врубаюсь как все это работать будет.Господа профи вы бы чего сказали умного.

Изменено 30 января, 2014 пользователем denis77515

#684

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

TmaSlope.v1.5_Normalized.mq48 скач.

#685

Господа профессиональные программисты подскажите чайнику,как быть в этом случаи. Написал советник в старом терминале build 509 а новый его не принимает то есть 579.при компиляции выдает кучу ошибок,тогда как старый компилирует без ошибок.и на оборот.Хотел поставить на демку советника на VPS Переустанавливал терминалы ставится 509. Дома на ноут ставится 579.короче не где, не что не работает,не чего не понимаю.В 579 похоже что MQL не 4, а 5.Так мне, не давно на мой вопрос отвечал парень ,с удивление спросил что за странная такая функция void OnTick() как не странно я под ней написал код,на тесторе он работал,как уже говорил хотел поставить на торговлю.не работает.ПОЯСНИТЕ КТО ЧТО ЗНАЕТ ПО ЭТОМУ ПОВОДУ ?

#686

Народ подскажите на что обратить внимание!!! Условие простое, выставить отложки в указанное время! НО на реале они не всегда выставляются! Почему? Вот Код:

 if(TimeToStr(TimeCurrent(), TIME_SECONDS) == HourStart ){

//------------------------------- buy conditions

if(Buy==true){


double pAsk = Ask + DistanceSet*Point;

BSL = NormalizeDouble (pAsk - BullStopLoss * Point, Digits);
BTP = NormalizeDouble (pAsk + BullTakeProfit * Point, Digits);

ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, pAsk, Slippage, 0, 0, NULL, MAGIC, 0, Blue);

if(ticket > 0){

if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) ==true)
OrderModify(ticket, OrderOpenPrice(), BSL, BTP, 0);
}
}

//------------------------------- sell conditions

if(Sell==true){

double pBid = Bid - DistanceSet*Point;

SSL = NormalizeDouble (pBid + BearStopLoss * Point, Digits);
STP = NormalizeDouble (pBid - BearTakeProfit * Point, Digits);

ticket = OrderSend(Symbol(), OP_SELLSTOP, Lots, pBid, Slippage,0 , 0, NULL, MAGIC, 0, Red);

if(ticket > 0){

if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) ==true)
OrderModify(ticket, OrderOpenPrice(), SSL, STP, 0);
}
}

}
Автор#687


Народ подскажите на что обратить внимание!!! Условие простое, выставить отложки в указанное время! НО на реале они не всегда выставляются! Почему? Вот Код:

 if(TimeToStr(TimeCurrent(), TIME_SECONDS) == HourStart ){

//------------------------------- buy conditions

if(Buy==true){


double pAsk = Ask + DistanceSet*Point;

BSL = NormalizeDouble (pAsk - BullStopLoss * Point, Digits);
BTP = NormalizeDouble (pAsk + BullTakeProfit * Point, Digits);

ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, pAsk, Slippage, 0, 0, NULL, MAGIC, 0, Blue);

if(ticket > 0){

if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) ==true)
OrderModify(ticket, OrderOpenPrice(), BSL, BTP, 0);
}
}

//------------------------------- sell conditions

if(Sell==true){

double pBid = Bid - DistanceSet*Point;

SSL = NormalizeDouble (pBid + BearStopLoss * Point, Digits);
STP = NormalizeDouble (pBid - BearTakeProfit * Point, Digits);

ticket = OrderSend(Symbol(), OP_SELLSTOP, Lots, pBid, Slippage,0 , 0, NULL, MAGIC, 0, Red);

if(ticket > 0){

if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) ==true)
OrderModify(ticket, OrderOpenPrice(), SSL, STP, 0);
}
}

}



замени своё условие на:

if (TimeHour(TimeCurrent()) == HourStart)
{
.....
}
#688



Народ подскажите на что обратить внимание!!! Условие простое, выставить отложки в указанное время! НО на реале они не всегда выставляются! Почему? Вот Код:

 if(TimeToStr(TimeCurrent(), TIME_SECONDS) == HourStart ){

//------------------------------- buy conditions

if(Buy==true){


double pAsk = Ask + DistanceSet*Point;

BSL = NormalizeDouble (pAsk - BullStopLoss * Point, Digits);
BTP = NormalizeDouble (pAsk + BullTakeProfit * Point, Digits);

ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, pAsk, Slippage, 0, 0, NULL, MAGIC, 0, Blue);

if(ticket > 0){

if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) ==true)
OrderModify(ticket, OrderOpenPrice(), BSL, BTP, 0);
}
}

//------------------------------- sell conditions

if(Sell==true){

double pBid = Bid - DistanceSet*Point;

SSL = NormalizeDouble (pBid + BearStopLoss * Point, Digits);
STP = NormalizeDouble (pBid - BearTakeProfit * Point, Digits);

ticket = OrderSend(Symbol(), OP_SELLSTOP, Lots, pBid, Slippage,0 , 0, NULL, MAGIC, 0, Red);

if(ticket > 0){

if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) ==true)
OrderModify(ticket, OrderOpenPrice(), SSL, STP, 0);
}
}

}



замени своё условие на:

if (TimeHour(TimeCurrent()) == HourStart)
{
.....
}



Спосибо за ответ xbms после выходных проверю!!! А с точностью до секунд можно?
#689

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

#690

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

#691

как сделать чтоб во время работы советника при открытии им любого ордера автоматически устанавливался на него определённый стоплосс ????

#692

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

что делать, как быть?

Безымянный.JPG

#693


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

что делать, как быть?


учить mql5. старого языка больше нет.
#694


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

что делать, как быть?



хаха да ладно start = ontick
#696

спасибо большое!!! я и не знал, что есть такие понятные видео-учебники, да еще и бесплатно)))

#697

вы хоть объясните, стоит ли продолжать это обучение, или уже этот урок не поможет в создании советников?

#698


вы хоть объясните, стоит ли продолжать это обучение, или уже этот урок не поможет в создании советников?



конечно стоит учи!!!! Смотри все уроки практикуй! а томот просто актуализируешься! ничо там сложного нет! Читай документацию очень Важно!!!
Кстате еслиб ты с первого урока начинал ты бы вопрос про start не задавал!
#699



вы хоть объясните, стоит ли продолжать это обучение, или уже этот урок не поможет в создании советников?



конечно стоит учи!!!! Смотри все уроки практикуй! а томот просто актуализируешься! ничо там сложного нет! Читай документацию очень Важно!!!
Кстате еслиб ты с первого урока начинал ты бы вопрос про start не задавал!


в первом же уроке говорится что start самая главная часть. но спасибо, буду изучать
#700




вы хоть объясните, стоит ли продолжать это обучение, или уже этот урок не поможет в создании советников?



конечно стоит учи!!!! Смотри все уроки практикуй! а томот просто актуализируешься! ничо там сложного нет! Читай документацию очень Важно!!!
Кстате еслиб ты с первого урока начинал ты бы вопрос про start не задавал!


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


Смотри дальше там говорится что старт это функция которая принимает и реагирует на каждый тик терминала! ну вот тебе и
void onTick()
{
вместо старт понятнее!!!

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

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