Алгоритм входа в рынок и выхода из рынка

 
Доброго времени суток!
Помогите, пожалуйста, с написанием следующего алгоритма:
если при закрытии предыдущего бара сформировалось условие для входа в рынок - входим в рынок при открытии текущего бара;
если при закрытии предыдущего бара сформировалось условие для выхода из рынка - выходим из рынка при открытии текущего бара.
 
Программирование - это мелочь в сравнении со знанием условий входа и выхода.
Есть они, эти условия?
 

Есть они, эти условия?
К примеру возьмём индикатор AMA - и его сигналы. Вот мне интересно, чтобы только после закрытия бара и сформировавшегося сигнала мы входили в рынок.
double UpSig=iCustom(NULL,0,"AMA",1,1); double DownSig=iCustom(NULL,0,"AMA",2,1);


используешь код
Ммм... Чего-то не получается, я что-то не так делаю:
void start() { double UpSig=iCustom(NULL,0,"AMA",1,1); double DownSig=iCustom(NULL,0,"AMA",2,1); int signal_buy=0; int signal_sell=0; // Устанавливаем signal_buy=1, если выполнены условия if (Close[1] && UpSig != 0) signal_buy=1; // Устанавливаем signal_sell=1, если выполнены условия if (Close[1] && DownSig != 0) signal_sell=1; if (signal_buy>0) { if (OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,"My comment",1000,0)==false) Print("Open a order failed with error #",GetLastError()); } if (signal_sell>0) { if (OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0,"My comment",1000,0)==false) Print("Open a order failed with error #",GetLastError()); } }

Ещё мне интересно, нафиг магическое число нужно?
 

Чтобы советник только свои ордера обслуживал.
Есть функция, которая возвращает магическое число открытого ордера: magic=OrderMagicNumber();
Можно отрыть неколько окон одной пары и одного периода и использовать разные советники.
Ясно.

Тут ты имеешь значение линии 1 и линии 2 индикатора AMA на баре 1.
А в чём условие входа в рынок?
С позволения создателей индикатора AMA выложу его код:
//+------------------------------------------------------------------+ //| AMA.mq4 | //| Copyright © 2004, MetaQuotes Software Corp. | //| https://www.metaquotes.net/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2004, by konKop,wellx" #property link "https://www.metaquotes.net/" #property indicator_chart_window #property indicator_buffers 3 #property indicator_color1 Sienna #property indicator_color2 DeepSkyBlue #property indicator_color3 Gold //---- input parameters extern int periodAMA=9; extern int nfast=2; extern int nslow=30; extern double G=2.0; extern double dK=2.0; //---- buffers double kAMAbuffer[]; double kAMAupsig[]; double kAMAdownsig[]; //+------------------------------------------------------------------+ int cbars=0, prevbars=0, prevtime=0; double slowSC,fastSC; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_LINE,0,2); SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(1,159); SetIndexStyle(2,DRAW_ARROW); SetIndexArrow(2,159); //SetIndexDrawBegin(0,nslow+nfast); SetIndexBuffer(0,kAMAbuffer); SetIndexBuffer(1,kAMAupsig); SetIndexBuffer(2,kAMAdownsig); IndicatorDigits(4); //slowSC=0.064516; //fastSC=0.2; //cbars=IndicatorCounted(); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int i,pos=0; double noise=0.000000001,AMA,AMA0,signal,ER; double dSC,ERSC,SSC,ddK; if (prevbars==Bars) return(0); //---- TODO: add your code here slowSC=(2.0 /(nslow+1)); fastSC=(2.0 /(nfast+1)); cbars=IndicatorCounted(); if (Bars<=(periodAMA+2)) return(0); //---- check for possible errors if (cbars<0) return(-1); //---- last counted bar will be recounted if (cbars>0) cbars--; pos=Bars-periodAMA-2; AMA0=Close[pos+1]; while (pos>=0) { if(pos==Bars-periodAMA-2) AMA0=Close[pos+1]; signal=MathAbs(Close[pos]-Close[pos+periodAMA]); noise=0.000000001; for(i=0;i<periodAMA;i++) { noise=noise+MathAbs(Close[pos+i]-Close[pos+i+1]); }; ER =signal/noise; dSC=(fastSC-slowSC); ERSC=ER*dSC; SSC=ERSC+slowSC; AMA=AMA0+(MathPow(SSC,G)*(Close[pos]-AMA0)); kAMAbuffer[pos]=AMA; ddK=(AMA-AMA0); if ((MathAbs(ddK)) > (dK*Point) && (ddK > 0)) kAMAupsig[pos] =AMA; else kAMAupsig[pos]=0; if ((MathAbs(ddK)) > (dK*Point) && (ddK < 0)) kAMAdownsig[pos]=AMA; else kAMAdownsig[pos]=0; AMA0=AMA; pos--; }; //---- prevbars=Bars; return(0); }

Значение на линии 1 - это сигнал вверх, на 2 - соответственно вниз.
Сдвиг беру на 1, чтобы знать, что бар закрылся и на нём возникли условия (не знаю, правильно ли это...).
Ещё хотелось бы провернуть следующее, если AMA возрастает - входим BUY, убывает - SELL.
Вроде как должно быть так:
double LastSig=iCustom(NULL,0,"AMA",0,1); double PrevSig=iCustom(NULL,0,"AMA",0,2); if (LastSig > PrevSig) // BUY if (LastSig < PrevSig) //SELL

Вот тока как это реализовать?
Была у меня одна версия, но она неправильно работает:
int start() { double UpSig=iCustom(NULL,0,"AMA",1,1); double DownSig=iCustom(NULL,0,"AMA",2,1); int cnt, ticket, total; bool est_s, est_b; total=OrdersTotal(); est_s=true; est_b=true; for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if((OrderType()==OP_SELL) && (OrderSymbol()==Symbol())) est_s=false; if((OrderType()==OP_BUY) && (OrderSymbol()==Symbol())) est_b=false; } if((UpSig != 0) && est_b) { ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,"starter",16384,0,Green); } if((DownSig != 0) && est_s) { ticket=OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0,"starter",16384,0,Red); } //---- for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) { if(UpSig == 0) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); return(0); } } else { if(DownSig == 0) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); return(0); } } } } //---- return(0); } //+------------------------------------------------------------------+
 
Большое спасибо за помощь!
mandor:

Смотри правила использования функции iCustom().
iCustom() я уже юзал, кстати не обязательно возвращать расширенные переменные индикатора.
А вот моя версия:
extern double lot = 0.1; extern int sl = 3; void start() { double AMA=iCustom(NULL,0,"AMA",0,1); double UpSig=iCustom(NULL,0,"AMA",1,1); double DownSig=iCustom(NULL,0,"AMA",2,1); int cnt, ticket, total; bool est_s=true, est_b=true; total=OrdersTotal(); for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()==OP_SELL) est_s=false; if(OrderType()==OP_BUY) est_b=false; } if(UpSig==AMA && est_b) ticket = OrderSend(Symbol(),OP_BUY,lot,Ask,sl,0,0); if(DownSig==AMA && est_s) ticket = OrderSend(Symbol(),OP_SELL,lot,Bid,sl,0,0); for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()==OP_BUY && UpSig==0) OrderClose(OrderTicket(),OrderLots(),Bid,sl); if(OrderType()==OP_SELL && DownSig==0) OrderClose(OrderTicket(),OrderLots(),Ask,sl); } }

Ещё раз спасибо, mandor!
Причина обращения: