Скачать MetaTrader 5

Помогите найти ошибку в коде

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Не знаешь, как пользоваться виджетом? Прочитай об этом статью!
alenm
31
alenm 2014.03.20 17:12 
int start()
{

Trailing();


double Line11=iCustom(Symbol(), 0, "TDI Red Green", RSI_Period, RSI_Price, Volatility_Band, RSI_Price_Line, RSI_Price_Type, Trade_Signal_Line, Trade_Signal_Type, 4, 1);
double Line12=iCustom(Symbol(), 0, "TDI Red Green", RSI_Period, RSI_Price, Volatility_Band, RSI_Price_Line, RSI_Price_Type, Trade_Signal_Line, Trade_Signal_Type, 4, 2);
double Line21=iCustom(Symbol(), 0, "TDI Red Green", RSI_Period, RSI_Price, Volatility_Band, RSI_Price_Line, RSI_Price_Type, Trade_Signal_Line, Trade_Signal_Type, 5, 1);

if (timeprev == Time[0]) return(0);
timeprev = Time[0];

ma0=iMA(NULL,0,10,0,MODE_SMA,PRICE_CLOSE,1);
ma1=iMA(NULL,0,200,0,MODE_SMA,PRICE_CLOSE,1);
ma2=iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,1);
ma3=iMA(NULL,0,800,0,MODE_SMA,PRICE_CLOSE,1);

if (CountBuy()>5 && Volume[0]==1 && Ask > ma0 && Ask > ma1 && Ask > ma3)
{
if (Line11>Level1&&Line12<Level1&&Line11>Line12)
OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, Ask-sl*Point, Ask+tp*Point, comment, Magic, 0, Blue);
}

if (CountSell()>5 && Volume[0]==1 && Bid < ma0 && Bid < ma1 && Ask < ma3)
{
if (Line11>Level2&&Line12>Level1&&Line11>Line12)
OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, Ask+sl*Point,Ask-tp*Point, comment, Magic, 0, Red);
}

return(0);
}


Помогите, пожалуйста, найти ошибку в коде с сигналом на открытие ордеров по индикатору TDI Red Green.

Тестер не открывает сделки, либо открывает только одну. При этом не сообщается ни о каких ошибках.

Буфера индикатора указал правильно.

Я изучаю язык mql4 только несколько дней, новичек)))

Заранее благодарен за помощь!!!

Viktor
228
Viktor 2014.03.20 18:05  
А, для чего нужна переменная "double Line21"?
alenm
31
alenm 2014.03.20 19:02  

Должно быть так, ошибся:

if (CountBuy()>5 && Volume[0]==1 && Ask > ma0 && Ask > ma1 && Ask > ma3)
{
if (Line11>Level1&&Line12<Level1&&Line11>Line21)
OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, Ask-sl*Point, Ask+tp*Point, comment, Magic, 0, Blue);
}

if (CountSell()>5 && Volume[0]==1 && Bid < ma0 && Bid < ma1 && Ask < ma3)
{
if (Line11>Level2&&Line12>Level1&&Line11>Line21)
OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, Ask+sl*Point,Ask-tp*Point, comment, Magic, 0, Red);
}


Но все равно не работает

Всеволод
648
Всеволод 2014.03.20 19:14  

Я бы избавился от Volume[0] проверка на новый бар и так выполняется...

Не видна реализация CountBuy, да и с линиями и их параметрами, не все понятно... ma 800 не слишком ли круто?

CountBuy()>5, мейби меньше?

Viktor
228
Viktor 2014.03.21 07:04  
alenm:

Должно быть так, ошибся:

Но все равно не работает

Так это же хорошо, осваивайте отладку.
Очень полезная вещь, новичкам особенно.
Dmitiry Ananiev
6586
Dmitiry Ananiev 2014.03.21 12:34  

1. Следующий ордер откроется если CountBuy <5 (если CountBuy - счетчик ордеров).

2. Вместо int start() используйте int OnStart().

3. Вместо Volume[0]==1 лучше использовать функцию определения нового бара или сравнивать кол-во баров на каждом тике с количеством баров на предыдущем баре :

int bar;
int OnStart()
{

Trailing();


double Line11=iCustom(Symbol(), 0, "TDI Red Green", RSI_Period, RSI_Price, Volatility_Band, RSI_Price_Line, RSI_Price_Type, Trade_Signal_Line, Trade_Signal_Type, 4, 1);
double Line12=iCustom(Symbol(), 0, "TDI Red Green", RSI_Period, RSI_Price, Volatility_Band, RSI_Price_Line, RSI_Price_Type, Trade_Signal_Line, Trade_Signal_Type, 4, 2);
double Line21=iCustom(Symbol(), 0, "TDI Red Green", RSI_Period, RSI_Price, Volatility_Band, RSI_Price_Line, RSI_Price_Type, Trade_Signal_Line, Trade_Signal_Type, 5, 1);

if (timeprev == Time[0]) return(0);
timeprev = Time[0];

ma0=iMA(NULL,0,10,0,MODE_SMA,PRICE_CLOSE,1);
ma1=iMA(NULL,0,200,0,MODE_SMA,PRICE_CLOSE,1); 
ma2=iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,1); 
ma3=iMA(NULL,0,800,0,MODE_SMA,PRICE_CLOSE,1); 

if (CountBuy()<5 && bar!=Bars && Ask > ma0 && Ask > ma1 && Ask > ma3)
{
if (Line11>Level1&&Line12<Level1&&Line11>Line12)
OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, Ask-sl*Point, Ask+tp*Point, comment, Magic, 0, Blue); 
}

if (CountSell()<5 && bar!=Bars && Bid < ma0 && Bid < ma1 && Ask < ma3)
{
if (Line11>Level2&&Line12>Level1&&Line11>Line12)
OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, Ask+sl*Point,Ask-tp*Point, comment, Magic, 0, Red); 
} 
bar=Bars; // лучше использовать функцию NewBar. Поищи в кодобазе
return(0); 
}
Ели Брокер ЕСN или ST, то сначала надо открыть позицию, потом выставлять СЛ и ТП. Этот подход более универсален для всех брокеров. 
Sergey Gustaytis
503
Sergey Gustaytis 2014.03.21 13:13  

alenm

dimeon:

У вас несколько проверок на начало бара, вот так проще и никакой функции не надо Ну и цены один раз запросить

datetime timeprev;
int OnStart()
{

//  на каждом тике
Trailing();

// все что ниже считается на первом тике нового бара на текущем таймфрэйме
if (timeprev == Time[0]) return(0);
timeprev = Time[0];
string symbol=Symbol();
double Line11=iCustom(symbol, 0, "TDI Red Green", RSI_Period, RSI_Price, Volatility_Band, RSI_Price_Line, RSI_Price_Type, Trade_Signal_Line, Trade_Signal_Type, 4, 1);
double Line12=iCustom(symbol, 0, "TDI Red Green", RSI_Period, RSI_Price, Volatility_Band, RSI_Price_Line, RSI_Price_Type, Trade_Signal_Line, Trade_Signal_Type, 4, 2);
double Line21=iCustom(symbol, 0, "TDI Red Green", RSI_Period, RSI_Price, Volatility_Band, RSI_Price_Line, RSI_Price_Type, Trade_Signal_Line, Trade_Signal_Type, 5, 1);

ma0=iMA(NULL,0,10,0,MODE_SMA,PRICE_CLOSE,1);
ma1=iMA(NULL,0,200,0,MODE_SMA,PRICE_CLOSE,1); 
ma2=iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,1); 
ma3=iMA(NULL,0,800,0,MODE_SMA,PRICE_CLOSE,1); 

double ask=MarketInfo(symbol,MODE_ASK);
double bid=MarketInfo(symbol,MODE_BID);
double point=MarketInfo(symbol,MODE_POINT);

if (CountBuy()<5 && ask > ma0 && ask > ma1 && ask > ma3)
{
if (Line11>Level1&&Line12<Level1&&Line11>Line12)
OrderSend(symbol, OP_BUY, Lots, ask, Slippage, bid-sl*point, bid+tp*point, comment, Magic, 0, Blue); 
}

if (CountSell()<5 && bid < ma0 && bid < ma1 && ask < ma3)
{
if (Line11>Level2&&Line12>Level1&&Line11>Line12)
OrderSend(symbol, OP_SELL, Lots, bid, Slippage, ask+sl*point,ask-tp*point, comment, Magic, 0, Red); 
} 

return(0); 
}
alenm
31
alenm 2014.03.21 23:28  

А что означает вот такая ошибка в тестере?

2014.03.22 01:26:09.859 TestGenerator: unmatched data error (volume limit 69 at 2014.03.14 20:30 exceeded)

alenm
31
alenm 2014.03.21 23:32  

Вот еще написал пробный советник по внутреннему бару и таже ошибка в тестере

2014.03.22 01:26:09.859 TestGenerator: unmatched data error (volume limit 69 at 2014.03.14 20:30 exceeded)

Вот код:

//+------------------------------------------------------------------+
//| inside-bar.mq4 |
//| Copyright 2014, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
extern double Lots = 0.1;
extern int sl = 30;
extern int tp = 50;
extern int Magic = 454;
extern int TrailingStop = 30;
extern int TrailingStep = 3;
extern int Slippage = 3;
extern int Indent = 10;
extern string comment = "inside bar";

double BS=0, SS=0, ma0, ma1, ma2;

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int init()
{
if (Digits == 3 || Digits == 5)
{
TrailingStop *= 10;
TrailingStep *= 10;
Slippage *= 10;
Indent *= 10;
sl *= 10;
tp *= 10;
}
return(0);
}

//+------------------------------------------------------------------+
//| Expert start function |
//+------------------------------------------------------------------+

int OnStart()
{
int sdel=0, otl=0;

ma0=iMA(NULL,0,10,0,MODE_SMA,PRICE_CLOSE,1); //---- пока не нужны
ma1=iMA(NULL,0,200,0,MODE_SMA,PRICE_CLOSE,1); //---- пока не нужны
ma2=iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,1); //---- пока не нужны

if (OrdersTotal()==0&&SS==0&&BS==0)
{
if (High[1]<=High[2]&&Low[1]>=Low[2]&&Volume[0]<2)
{
if ((High[2]-Ask)/Point>MarketInfo(Symbol(), MODE_STOPLEVEL))
OrderSend(Symbol(), OP_BUYSTOP, Lots, High[2],Slippage,High[2]-sl,High[2]+tp,comment,Magic,0,Green);
else
{
BS=High[2]+Indent; Print("Виртуальный BS: ", BS);
}

if ((Bid-Low[2])/Point>MarketInfo(Symbol(), MODE_STOPLEVEL))
OrderSend(Symbol(), OP_SELLSTOP, Lots, Low[2],Slippage,Low[2]+sl,Low[2]-tp,comment,Magic,0,Red);
else
{
SS=Low[2]-Indent; Print("Виртуальный SS: ", SS);
}
}
}

if (OrdersTotal()==0&&SS>0&&BS>0)
{
if (Bid<=SS) {OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, Bid+sl, Bid-tp, comment, Magic, 0, Red); SS=0; return(0);}
else if (Ask>=BS) {OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, Ask-sl, Ask+tp, comment, Magic, 0, Green); BS=0; return(0);}
}
if (OrdersTotal()==1&&(SS>0||BS>0))
{
OrderSelect (0, SELECT_BY_POS,MODE_TRADES);
if (OrderType()==OP_BUYSTOP)
{
if (Bid<=SS) {OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, Bid+sl, Bid-tp, comment, Magic, 0, Red); SS=0; return(0);}
}
else if (OrderType()==OP_SELLSTOP)
{
if (Ask>=BS) {OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, Ask-sl, Ask+tp, comment, Magic, 0, Green); BS=0; return(0);}
}
else if (OrderType()==OP_BUY)
{
SS=0; return(0);
}
else if (OrderType()==OP_SELL)
{
BS=0; return(0);
}
}

if (OrdersTotal()==2)
{
SS=0; BS=0;
for (int pos=0; pos<OrdersTotal(); pos++)
{
OrderSelect (pos, SELECT_BY_POS);
if (OrderType()<2) sdel++; else otl++;
}

if (sdel==1)
{
for (pos=0; pos<OrdersTotal(); pos++)
{
OrderSelect (pos, SELECT_BY_POS);
if (OrderType()>1) OrderDelete(OrderTicket());
}
}
}

return(0);
}

Sergey Gustaytis
503
Sergey Gustaytis 2014.03.22 08:10  
alenm:

Вот еще написал пробный советник по внутреннему бару и таже ошибка в тестере

2014.03.22 01:26:09.859 TestGenerator: unmatched data error (volume limit 69 at 2014.03.14 20:30 exceeded)

Вот код:


alenm:

Вот еще написал пробный советник по внутреннему бару и таже ошибка в тестере

2014.03.22 01:26:09.859 TestGenerator: unmatched data error (volume limit 69 at 2014.03.14 20:30 exceeded)

Вот код:

extern int sl = 30;
extern int tp = 50;
extern int Magic = 454;

sl *= 10;

tp *= 10;

OrderSend(Symbol(), OP_BUYSTOP, Lots, High[2],Slippage,High[2]-sl,High[2]+tp,comment,Magic,0,Green);
OrderSend(Symbol(), OP_SELLSTOP, Lots, Low[2],Slippage,Low[2]+sl,Low[2]-tp,comment,Magic,0,Red)



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


Ну вот в экстерне ТП и СЛ заданы в пунктах и в коде прибаляются к цене к High[2]+tp = 1.38531 + 100 = 101.38531; High[2]-sl = 1.38531 - 100= -98.....

Кстати, в первом коде правильно :)

Print("Виртуальный SS: ", SS);  Что Пишет?
OrderSend(Symbol(), OP_BUYSTOP, Lots, High[2],Slippage,High[2]-sl*Point,High[2]+tp*Point,comment,Magic,0,Green);
OrderSend(Symbol(), OP_SELLSTOP, Lots, Low[2],Slippage,Low[2]+sl*Point,Low[2]-tp*Point,comment,Magic,0,Red);
BS=High[2]+Indent*Point; 
SS=Low[2]-Indent*Point; 


alenm
31
alenm 2014.03.22 18:45  

Эти ошибки исправил *Point но ошибки в тестере не исчезли.

2014.03.22 20:42:49.390 TestGenerator: unmatched data error (volume limit 69 at 2014.03.14 20:30 exceeded)

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий