помогите найти ошибку в написанном советнике

 

Доброго времени суток!!! попытался написать советника на основе индикатора Hist_StepMA_Stoch_KV1_Ex_03. при компиляции ошибок не выдает. Но в тестере не открывает сделки. что не так? сам советник и индикатор в прикрепленном файле.

Кому не трудно - помогите пожалуйста!! заранее благодарен!!!

 
Индикатор не открывает сделок, Это делает только советник. И где ваш индикатор, не прикрепился что-то.
 
Sepulca:
Индикатор не открывает сделок, Это делает только советник. И где ваш индикатор, не прикрепился что-то.


индикатор

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#property link "http://forexbig.ru"
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

//+------------------------------------------------------------------+
//| StepMA_Stoch_KV1.mq4 |
//| Copyright © 2005, TrendLaboratory Ltd. |
//| E-mail: igorad2004@list.ru |
//| modified by Kalenzo -> simone@konto.pl |
//| modified by raduga 21.04.2006 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, TrendLaboratory Ltd."
#property link "E-mail: igorad2004@list.ru"

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Green

//#property indicator_minimum -1
//#property indicator_maximum 1

//---- input parameters
extern int PeriodWATR=10;
extern double Kwatr=1.0000;
extern int HighLow=0;
extern int NumberOfBarsToCalculate = 500;
//---- indicator buffers
double LineMinBuffer[];
double LineMidBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
Comment("");
//---- indicator line
SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,2);
SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,2);
SetIndexBuffer(0,LineMinBuffer);
SetIndexBuffer(1,LineMidBuffer);
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
//---- name for DataWindow and indicator subwindow label
//short_name="StepMA Stoch("+PeriodWATR+","+Kwatr+","+HighLow+")";

SetIndexLabel(0,"StepMA Stoch 1");
SetIndexLabel(1,"StepMA Stoch 2");
//----
SetIndexDrawBegin(0,PeriodWATR);
SetIndexDrawBegin(1,PeriodWATR);
/**
*raduga:
*USELESS !!!! Throws "ArrayInitialization" Exception !!!!
**/
//======================================================
//ArrayInitialize(LineMinBuffer,0);
//ArrayInitialize(LineMidBuffer,0);
SetIndexEmptyValue(0,0.0);
SetIndexEmptyValue(1,0.0);
//=====================================================
//----
return(0);
}

//+------------------------------------------------------------------+
//| StepMA_3D_v1 |
//+------------------------------------------------------------------+
int start()
{
string short_name;
short_name = "Max bars to count: |"+(Bars-1)+"| ";
IndicatorShortName(short_name);

int i,shift,TrendMin,TrendMax,TrendMid;
double SminMin0,SmaxMin0,SminMin1,SmaxMin1,SumRange,dK,WATR0,WATRmax,WATRmin,WATRmid;
double SminMax0,SmaxMax0,SminMax1,SmaxMax1,SminMid0,SmaxMid0,SminMid1,SmaxMid1;
double linemin,linemax,linemid,Stoch1,Stoch2,bsmin,bsmax;
//raduga : Variable theDelta - has a differense between two bsmin/max lines
double theDelta;

double prev_y = 0,prev_b = 0;

for(shift=NumberOfBarsToCalculate-1;shift>=0;shift--)
{
SumRange=0;
//raduga: initialization because of ZERO-DEVIDE ERROR
//===============================
Stoch1 = 0.0;
Stoch2 = 0.0;
//===============================
for (i=PeriodWATR-1;i>=0;i--)
{
dK = 1+1.0*(PeriodWATR-i)/PeriodWATR;
//raduga: MathAbs has no sense ragarding High - Low... Probably Close - open !!!!
//SumRange+= dK*MathAbs(High[i+shift]-Low[i+shift]);
SumRange+= dK*(High[i+shift]-Low[i+shift]);
}
WATR0 = SumRange/PeriodWATR;

WATRmax=MathMax(WATR0,WATRmax);
if (shift==NumberOfBarsToCalculate-1-PeriodWATR) WATRmin=WATR0;
WATRmin=MathMin(WATR0,WATRmin);

int StepSizeMin=MathRound(Kwatr*WATRmin/Point);
int StepSizeMax=MathRound(Kwatr*WATRmax/Point);
int StepSizeMid=MathRound(Kwatr*0.5*(WATRmax+WATRmin)/Point);

if (HighLow>0)
{
SmaxMin0=Low[shift]+2*StepSizeMin*Point;
SminMin0=High[shift]-2*StepSizeMin*Point;

SmaxMax0=Low[shift]+2*StepSizeMax*Point;
SminMax0=High[shift]-2*StepSizeMax*Point;

SmaxMid0=Low[shift]+2*StepSizeMid*Point;
SminMid0=High[shift]-2*StepSizeMid*Point;

if(Close[shift]>SmaxMin1) TrendMin=1;
if(Close[shift]<SminMin1) TrendMin=-1;

if(Close[shift]>SmaxMax1) TrendMax=1;
if(Close[shift]<SminMax1) TrendMax=-1;

if(Close[shift]>SmaxMid1) TrendMid=1;
if(Close[shift]<SminMid1) TrendMid=-1;
}

if (HighLow == 0)
{
SmaxMin0=Close[shift]+2*StepSizeMin*Point;
SminMin0=Close[shift]-2*StepSizeMin*Point;

SmaxMax0=Close[shift]+2*StepSizeMax*Point;
SminMax0=Close[shift]-2*StepSizeMax*Point;

SmaxMid0=Close[shift]+2*StepSizeMid*Point;
SminMid0=Close[shift]-2*StepSizeMid*Point;

if(Close[shift]>SmaxMin1) TrendMin=1;
if(Close[shift]<SminMin1) TrendMin=-1;

if(Close[shift]>SmaxMax1) TrendMax=1;
if(Close[shift]<SminMax1) TrendMax=-1;

if(Close[shift]>SmaxMid1) TrendMid=1;
if(Close[shift]<SminMid1) TrendMid=-1;
}

if(TrendMin>0 && SminMin0<SminMin1) SminMin0=SminMin1;
if(TrendMin<0 && SmaxMin0>SmaxMin1) SmaxMin0=SmaxMin1;

if(TrendMax>0 && SminMax0<SminMax1) SminMax0=SminMax1;
if(TrendMax<0 && SmaxMax0>SmaxMax1) SmaxMax0=SmaxMax1;

if(TrendMid>0 && SminMid0<SminMid1) SminMid0=SminMid1;
if(TrendMid<0 && SmaxMid0>SmaxMid1) SmaxMid0=SmaxMid1;


if (TrendMin>0) linemin=SminMin0+StepSizeMin*Point;
if (TrendMin<0) linemin=SmaxMin0-StepSizeMin*Point;

if (TrendMax>0) linemax=SminMax0+StepSizeMax*Point;
if (TrendMax<0) linemax=SmaxMax0-StepSizeMax*Point;

if (TrendMid>0) linemid=SminMid0+StepSizeMid*Point;
if (TrendMid<0) linemid=SmaxMid0-StepSizeMid*Point;

bsmin=linemax-StepSizeMax*Point;
bsmax=linemax+StepSizeMax*Point;
//raduga: ZERO-DEVIDE-ERROR
//=============================
theDelta = bsmax-bsmin;
if(theDelta != 0)
{
Stoch1=NormalizeDouble((linemin-bsmin)/theDelta,6);
Stoch2=NormalizeDouble((linemid-bsmin)/theDelta,6);
}
//==============================
prev_y = (Stoch1 - Stoch2);
if(prev_y<0.0){
LineMinBuffer[shift] = prev_y;
LineMidBuffer[shift] = 0;
}
else if(prev_y>0.0){
LineMidBuffer[shift] = prev_y;
LineMinBuffer[shift] = 0;
}

//prev_y = Stoch1;
//prev_b = Stoch2;


SminMin1=SminMin0;
SmaxMin1=SmaxMin0;

SminMax1=SminMax0;
SmaxMax1=SmaxMax0;

SminMid1=SminMid0;
SmaxMid1=SmaxMid0;
}
return(0);
}


советник

//+------------------------------------------------------------------+
//| второй советник А.mq4 |
//| Copyright © 2010, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"

extern int Magic=1982; //магический номер ордеров
extern bool UseStopLoss = true; //выключатель SL
extern bool UseTakeProfit = true; //выключатель TP
extern bool UseTrailing = true;//выключатель трейлинга
extern double TrailingStop = 40;
extern double Lots =1; // Жестко заданное колич. лотов
extern double StopLoss =30; // SL для открываемого ордера
extern double TakeProfit=50; // ТР для открываемого ордера
//---- input parameters
extern int PeriodWATR=10;
extern double Kwatr=1.0000;
extern int HighLow=0;
extern double Level =0.00;
//--------------------------------------------------------------
bool Work=true; // Эксперт будет работать.
string Symb; // Название финанс. инструмента

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
int
Total, // Количество ордеров в окне
Ticket, // Номер ордера
Tip=-1; // Тип выбран. ордера (B=0,S=1)
double PeriodWATR, Kwatr, HighLow, Lot, Price, SL, TP, L_1, L_2;
bool
Ans =false, // Ответ сервера после закрытия
Cls_B=true, // Критерий для закрытия Buy
Cls_S=true, // Критерий для закрытия Sell
Opn_B=true, // Критерий для открытия Buy
Opn_S=true; // Критерий для открытия Sell
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
int A= PeriodWATR;
int B= HighLow;
int C= Kwatr;
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
double L_1= iCustom (NULL,0,"StepMA_Stoch_KV1",PeriodWATR,HighLow,Kwatr,1,0);
double L_2= iCustom (NULL,0,"StepMA_Stoch_KV1",PeriodWATR,HighLow,Kwatr,2,0);

if (L_2<=-Level && L_1>L_2)
{
OrderSelect (NULL,OP_BUY,(Symbol(),Lots,TrailingStop,StopLoss,TakeProfit,1,0));
}

if (L_2>=Level && L_1<L_2)
{
OrderSelect(NULL,OP_SELL,(Symbol(),Lots,TrailingStop,StopLoss,TakeProfit,2,0));
}
return(0);
}
//+------------------------------------------------------------------+ 

 

OrderSelect (NULL,OP_BUY,(Symbol(),Lots,TrailingStop,StopLoss,TakeProfit,1,0));

Зачем скобки внутри функции? 

 
Roger:

OrderSelect (NULL,OP_BUY,(Symbol(),Lots,TrailingStop,StopLoss,TakeProfit,1,0));

Зачем скобки внутри функции? 



без них выдает ошибку - ')' - wrong parameters count
 

Так напишите

OrderSelect (NULL,OP_BUY,Symbol(),Lots,TrailingStop,StopLoss,TakeProfit,1,0);

ошибки не будет. 

Да, и причем тут трейлинг стоп в формуле? Этот параметр должен быть целым числом.

 
Roger:

Так напишите

OrderSelect (NULL,OP_BUY,Symbol(),Lots,TrailingStop,StopLoss,TakeProfit,1,0);

ошибки не будет. 


попробовал, ошибка все таки есть ')' - wrong parameters count
 
ramses4444:

попробовал, ошибка все таки есть ')' - wrong parameters count

В общем, читайте матчасть, чтобы все элементы формулы были правильными. стопы и тейки тоже неправильны
 
ramses4444:


без них выдает ошибку - ')' - wrong parameters count


может быть потому что вы использовали не ту функцию? )))

в metaeditor поставьте курсор в тело имени функции и нажмите f1, выйдет справочка где все расписано.

вам нужно применять функцию OrderSend а не OrderSelect

идем даьше:

1) все что вы написали в функциях init и deinit (или откудато скопип*здили) удалите вместе с функциями, это ничего не дает.

2)  вот это:
bool Work=true; // Эксперт будет работать.
string Symb; // Название финанс. инструмента
тоже удалите, оно не используется у вас.

3) после того как вы все это сделаете вы увидите что он начнет лупить сотник ордеров просто так. Функция start исполняется на каждом тике. т.е. на каждом тике просиходит что?
проверка индикаторов, сравнение их значений и выставление позиций (все по вашему коду). Значит нужно добавить код, что если позиция уже есть, он ничего не делал. В начале добавьте вот это:

for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol && OrderMagicNumber()==Magic) return;

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

 
keep87:


может быть потому что вы использовали не ту функцию? )))

в metaeditor поставьте курсор в тело имени функции и нажмите f1, выйдет справочка где все расписано.

вам нужно применять функцию OrderSend а не OrderSelect

идем даьше:

1) все что вы написали в функциях init и deinit (или откудато скопип*здили) удалите вместе с функциями, это ничего не дает.

2)  вот это:
bool Work=true; // Эксперт будет работать.
string Symb; // Название финанс. инструмента
тоже удалите, оно не используется у вас.

3) после того как вы все это сделаете вы увидите что он начнет лупить сотник ордеров просто так. Функция start исполняется на каждом тике. т.е. на каждом тике просиходит что?
проверка индикаторов, сравнение их значений и выставление позиций (все по вашему коду). Значит нужно добавить код, что если позиция уже есть, он ничего не делал. В начале добавьте вот это:

for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol && OrderMagicNumber()==Magic) return;

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


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