Добрый день.
Может подскажет кто-нибудь? На тестере все работает как часы, как подключаю его на несколько валютных пар, начинается выставление кучи ордеров, не открываются какие нужно и не закрываются как нужно отложенные ордера. Пробовал исправить путем добавления кодов по выбору ордеров, но все больше заходил в тупик. Наверняка есть какой-то простой код, чтобы все происходило как на тестере.
Стратегия очень простая.
Через каждые полчаса открывается рыночный ордер (например BUY) lot=0.1 с ТП 5 пунктов и стопом 100 пунктов по значениям из стохастика, через 80 пунктов от цены открытия рыночного — отложенный ордер (SELLSTOP) Lot1=lot*6 в сторону StopLoss рыночного (алгоритм расчета есть) со стопом 70 пунктов и ТП равным 25 пунктов. В случае открытия отложенного (SELLSTOP) ордера выставляется отложенный(BUYSTOP) на 50пунков от цены открытия (SELLSTOP) с объемом Lot2=Lot1+3 в сторону StopLoss SELLSTOP.
При выполнения тэйк-профита — закрытие всех отложенных.
Стратегия простая, но я только на тестере любой пары добился решения. При совместной работе с другими парами возникает хаос.
extern int StochK=200;
extern int StochD=12;
extern int StochSlowing=1;
extern int UpperThreshold=80;
extern int LowerThreShold=20;
extern int Mn=140; //Magic
extern int mn;
extern int X=1;
extern int TimFr1=48, TimFr2=24,TimFr3=4;
extern int n=6;
extern double Lot1;
extern double lots;
extern double Lot;
int Ontime()
{
int time=0;
if((Hour()==2&&Minute()<=1)||(Hour()==2&&Minute()==30)||(Hour()==3&&Minute()<=1))
time=1;
return(time);
}
void PutOrderStop(int order_type,double price,double SL,double TP,int Magic)
{
int sellstop=0;
sellstop=OrderSend(Symbol(),order_type,Lot,price,0,SL,TP,"My order#",Mn,0,Red);
return;
}
int CountTrades()
{
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Mn)
{
if(OrderType()<4)
count++;
}
}
}
return(count);
}
//=========================================================
int BuyTicket;
int SellTicket;
int start()
{
double S=AccountMargin() + AccountFreeMargin();
int OPB1,OPS1,ss;
int T=7*X;
double AA = iClose(NULL,PERIOD_H1,TimFr1),BB = iClose(NULL,PERIOD_H1,TimFr2),
CC=iClose(NULL,PERIOD_H1,1),AK = iOpen(NULL,PERIOD_H1,4);
if(S<10000000)
lots= S*0.0002;
double AC=(CC-AA)/Point,AKC=(CC-AK)/Point,BC=(CC-BB)/Point;
double TR = AC;
double Signal=iStochastic(Symbol(),0,StochK,StochD,StochSlowing,MODE_SMA,STO_LOWHIGH,MODE_SIGNAL,1);
double Main=iStochastic(Symbol(),0,StochK,StochD,StochSlowing,MODE_SMA,STO_LOWHIGH,MODE_MAIN,1);
double Last=iStochastic(Symbol(),0,StochK,StochD,StochSlowing,MODE_SMA,STO_LOWHIGH,MODE_BASE,2);
int s,SS;
if(Signal>Main)
{
double m=Signal/(Main+0.0001);
}
else
if(Signal<Main)
m=Main/(Signal+0.0001);
double ma=m*100;
int DSM=Signal-Main;
int DMS=Main-Signal;
if(Signal>Main&&Signal<70)
{
if((DSM>10&&DSM<30)&&((ma>100&&ma<115)||(ma>120&&ma<700)))
{OPB1=1; ss=m*Signal; if(ss<90)ss=m*70;if(ss>100)ss=100; SS=ss;}
else
if(((ma>105&&ma<105)||(ma>125&&ma<140)||(ma>145&&ma<700)))
{OPS1=1; ss=m*Main; if(ss<90)ss=m*90;if(ss>120)ss=110; SS=150;}
}
s=ss/(n-1);//отработка
s=s*X;
ss=ss*X;
SS=SS*X;
double Bstoploss,Sstoploss;
Bstoploss=Bid-ss*Point;
Sstoploss=Ask+ss*Point;
int PriceBuy=ss-s-10;
int PriceSell=ss-s-10;
double BstopOpen =Ask+ PriceBuy*Point;
double SstopOpen =Bid- PriceSell*Point;
double BuyStopLoss=Bid-ss*Point,SellStopLoss=Ask+ss*Point;
double BstopOpenLoss = BstopOpen-SS*Point;
double SstopOpenLoss = SstopOpen+SS*Point;
double BstopClose = BstopOpen+s*Point;
double SstopClose = SstopOpen-s*Point;
Lot=lots*n;
Lot1=lots*(n+n/2);
double OPBSS=OrderOpenPrice()-30*X*Point; double OPSSS=OrderOpenPrice()+30*X*Point;
bool operation=0;
for(int pos=0;pos<OrdersTotal();pos++)
{if ( OrderSelect (pos, SELECT_BY_POS) == false ) continue;
if ( OrderSymbol()==Symbol()) break;}
if(Ontime()==1){
if(OPB1==1)
{operation=1;if(operation==1 && (OrderSymbol()!=Symbol()||OrdersTotal()==0))
int OP=OrderSend(Symbol(),OP_BUY,lots,Ask,0,Bid-ss*Point,Ask+T*Point,"My order#",mn,0,Green);
}
if( OP>0 )
{if((OrderSymbol()!=Symbol()||OrdersTotal()==1))
PutOrderStop(5,SstopOpen,SstopOpenLoss,SstopClose,Mn);}
if(OPS1==1)
{operation=1;if(operation==1 &&(OrderSymbol()!=Symbol()||OrdersTotal()==0))
int OPSs=OrderSend(Symbol(),OP_SELL,lots,Bid,0,Ask+ss*Point,Bid-T*Point,"My order#",mn,0,Red);
}
if( OPSs>0 )
{if((OrderSymbol()!=Symbol()||OrdersTotal()==1))
PutOrderStop(4,BstopOpen,BstopOpenLoss,BstopClose,Mn);
}
}
if(CountTrades()==1){
if((OrderSymbol()!=Symbol()||OrdersTotal()==2))
{
BuyTicket = OrderSend(Symbol(),OP_BUYSTOP,Lot1,OPBSS,0,OPBSS-70*X*Point,OPBSS+45*X*Point,"My order#",Mn,0,Blue);}
return(0);
}
if(CountTrades()==1){
if((OrderSymbol()!=Symbol()||OrdersTotal()==2)){
SellTicket=OrderSend(Symbol(),OP_SELLSTOP,Lot1,OPSSS,0,OPSSS+70*X*Point,OPSSS-30*X*Point,"My order#",Mn,0,Red);}
return(0);
}
if(OrderMagicNumber()==Mn)
{
for(int j=OrdersTotal()-1; j>=0; j--)
if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES))
{
if(OrderType()==OP_BUYSTOP && OrderSymbol()==Symbol()&&OrderMagicNumber())
int del=OrderDelete(OrderTicket());
if(OrderType()==OP_SELLSTOP && OrderSymbol()==Symbol()&&OrderMagicNumber())
del=OrderDelete(OrderTicket());
}
return(0);
}
Comment("\n | SIMsim ", " Валюта ",Symbol(),
"\n | Значения TR ",TR,
"\n | Значения OrdersTotal() ",OrdersTotal(),
"\n | Значения OPr ",0,
"\n | Значения ma === ",ma," Значения total_orders ",TotalOpenOrders(),
"\n | Значения OPB1 ",OPB1," Значения OPS1 ",OPS1,
"\n | Значения Main ",Main," Значения DSM ",DSM," Значения DMS ",DMS,
"\n | Значения Signal ",Signal," Значения OPBSS ",OPBSS," Значения OPBSS ",OPSSS,
"\n | Значения lots ",lots," Значения OrderOpenPrice() ",OrderOpenPrice(),
"\n | Значения ss ",ss," Значения count ",CountTrades(),
"\n | Mn ",Mn
);
return(0);
}
Комментарии (1)
Оберни в функцию Таймер
13 axe44 Сообщений: 1149 - Алек
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий