Рабочий ли код? - страница 3

 
Andrey Kisselyov:

проверяете в тестере стратегий или на демо?

с уважением.


и в тестере и на демо,эффект один

 
Stepan Lyzlov:

и в тестере и на демо,эффект один

1 данный советник проверяет изменение цены от цены закрытия последнего бара, вы в курсе что график формируется ценой БИД  а не АСК и судя по коду логичнее было бы смотреть изменение БИД?
2 возможно у вас маленький тф и бары слишком малы чтоб открывать по ним ордера, попробуйте поставить советник на 1 час для начала и прогнать в тестере хотя бы на месячной истории.

с уважением.

P.S. выложите код целиком, как он есть, а не кусками.

 
Andrey Kisselyov:

1 данный советник проверяет изменение цены от цены закрытия последнего бара, вы в курсе что график формируется ценой БИД  а не АСК и судя по коду логичнее было бы смотреть изменение БИД?
2 возможно у вас маленький тф и бары слишком малы чтоб открывать по ним ордера, попробуйте поставить советник на 1 час для начала и прогнать в тестере хотя бы на месячной истории.

с уважением.

P.S. выложите код целиком, как он есть, а не кусками.


1.Исправил и вообще ничего теперь не происходит. 2.Не происходит ни на одном тф.

extern int      stoploss=0,//Уровень выставления SL, если 0, то SL не выставляется
takeprofit    = 0,//Уровень выставления TP, если 0, то TP не выставляется
MaxOrders     = 1,//Кол-во ордеров
Magic=717;   //Magic
extern double   LotPr=0.1;      //Лот позиции
extern int      attempts=7;       //Кол-во попыток открытия
string txt;
input int     TrailingStop = 10;     //Расстояние после которого переводим в БУ и тралим
input int     StepTrall    = 10;     //Степ трала
input int     TakeProflt   = 100;    //Тейк
int n,slippage=3;
double STOPLEVEL;
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
   if(Digits()==3 || Digits()==5) slippage=30;

   double c1,cpr;
   c1=iClose(Symbol(),0,1);
   cpr=MathAbs(c1-Bid);

   for(int i=1; i<=MaxOrders; i++)
     {
      if(c1<Bid && cpr>0.00010)
        {
         OPENORDER(OP_BUY,NormalizeDouble(Ask,Digits()),LotPr,i);
        }
      if(c1>Bid && cpr>0.00010)
        {
         OPENORDER(OP_SELL,NormalizeDouble(Bid,Digits()),LotPr,i);
        }
     }

   double OSL,OTP,OOP,StLo,SL,TP;
   int tip;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            tip = OrderType();
            OSL = NormalizeDouble(OrderStopLoss(),Digits());
            OTP = NormalizeDouble(OrderTakeProfit(),Digits());
            OOP = NormalizeDouble(OrderOpenPrice(),Digits());
            SL=OSL;TP=OTP;
            if(tip==OP_BUY)
              {
               if(OSL==0 && stoploss!=0)
                 {
                  SL=NormalizeDouble(OOP-stoploss  *Point(),Digits());
                 }
               if(OTP==0 && TakeProflt!=0)
                 {
                  TP=NormalizeDouble(OOP+TakeProflt*Point(),Digits());
                 }
               if(TrailingStop!=0)
                 {
                  StLo=NormalizeDouble(Bid-TrailingStop*Point(),Digits());
                  if(StLo>=OOP && StLo>=OSL+StepTrall*Point()) SL=StLo;
                 }
               if(SL!=OSL || TP!=OTP)
                 {
                  if(!OrderModify(OrderTicket(),OOP,SL,TP,0,White)) Print("Error OrderModify ",GetLastError());
                 }
              }
            if(tip==OP_SELL)
              {
               if(OSL==0 && stoploss!=0)
                 {
                  SL=NormalizeDouble(OOP+stoploss  *Point(),Digits());
                 }
               if(OTP==0 && TakeProflt!=0)
                 {
                  TP=NormalizeDouble(OOP-TakeProflt*Point(),Digits());
                 }
               if(TrailingStop!=0)
                 {
                  StLo=NormalizeDouble(Ask+TrailingStop*Point(),Digits());
                  if(StLo<=OOP && (StLo<=OSL-StepTrall*Point() || OSL==0)) SL=StLo;
                 }
               if(SL!=OSL || TP!=OTP)
                 {
                  if(!OrderModify(OrderTicket(),OOP,SL,TP,0,White)) Print("Error OrderModify ",GetLastError());
                 }
              }
           }
        }
     }
   return(0);
  }
//---
void OPENORDER(int ord,double Price,double LOT,int i)
  {
   int error,err;
   double SL=0,TP=0;
   while(true)
     {
      error=true;
      RefreshRates();
      if(ord==OP_BUY)
        {
         if(takeprofit>=STOPLEVEL) TP=NormalizeDouble(Price+takeprofit*Point(),Digits()); else TP=0;
         if(stoploss>=STOPLEVEL) SL=NormalizeDouble(Price-stoploss*Point(),Digits());   else SL=0;
         error=OrderSend(Symbol(),OP_BUY,LOT,Price,slippage,SL,TP," ",Magic,0,Blue);
         Print("error=", error, "  LOT=", LOT, "  Price=", DoubleToString(Price, 8),"Poza=", OP_BUY);
        }
      if(ord==OP_SELL)
        {
         if(takeprofit>=STOPLEVEL) TP=NormalizeDouble(Price-takeprofit*Point(),Digits()); else TP=0;
         if(stoploss>=STOPLEVEL) SL=NormalizeDouble(Price+stoploss*Point(),Digits());   else SL=0;
         error=OrderSend(Symbol(),OP_SELL,LOT,Price,slippage,SL,TP," ",Magic,0,Red);
         Print("error=", error, "  LOT=", LOT, "  Price=", DoubleToString(Price, 8),"Poza=", OP_SELL);
        }
      if(error==-1)
        {
         txt=StringConcatenate(txt,"\nError ",GetLastError());
         if(ord== 1) txt = StringConcatenate(txt,"  OPENORDER BUY ",i,"   Ask =",DoubleToStr(Ask,Digits()),"   Price =",DoubleToStr(Price,Digits())," (",NormalizeDouble((Price-Ask)/Point(),0),")  SL =",DoubleToStr(SL,Digits())," (",NormalizeDouble((Price-SL)/Point(),0),")  TP=",DoubleToStr(TP,Digits())," (",NormalizeDouble((TP-Price)/Point(),0),")  STOPLEVEL=",STOPLEVEL);
         if(ord==-1) txt = StringConcatenate(txt,"  OPENORDER SELL ",i,"   Bid =",DoubleToStr(Bid,Digits()),"   Price =",DoubleToStr(Price,Digits())," (",NormalizeDouble((Bid-Price)/Point(),0),")  SL =",DoubleToStr(SL,Digits())," (",NormalizeDouble((SL-Price)/Point(),0),")  TP=",DoubleToStr(TP,Digits())," (",NormalizeDouble((Price-TP)/Point(),0),")  STOPLEVEL=",STOPLEVEL);
         Print(txt);
         Comment(txt,"  ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
         err++;Sleep(1000);RefreshRates();
        }
      else
        {
         Comment("Ордер ",error," успешно выставлен ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
         n++;
         break;
        }
      if(err >attempts) break;
     }
   return;
  }
//+------------------------------------------------------------------+


с уважением.

 
Stepan Lyzlov:

1.Исправил и вообще ничего теперь не происходит. 2.Не происходит ни на одном тф.


с уважением.

замените
OnInit()
на
OnTick()
с уважением.
 
Andrey Kisselyov:
замените с уважением.

ругается...ошибка говорит

 
Stepan Lyzlov:

ругается...ошибка говорит

тогда допишите так
int OnInit()
{
   return(INIT_SUCCEEDED);
}
int OnTick()


с уважением.

 
Andrey Kisselyov:
тогда допишите так


с уважением.


Ничего не происходит по прежнему, но ошибки нет.

 
Stepan Lyzlov:

Ничего не происходит по прежнему, но ошибки нет.

int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
int OnTick()
  {

   STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
   if(Digits()==3 || Digits()==5) slippage=30;

   double c1,cpr;
   c1=iClose(Symbol(),0,1);
   cpr=MathAbs(c1-Bid);

   ...
у вас так получилось или по другому?

с уважением
 
Andrey Kisselyov:
у вас так получилось или по другому?

с уважением

так

 
Stepan Lyzlov:

так

проверил, в мт4 проблемы с функциями.

OnTick() не работает, замените на start()

с уважением.
Причина обращения: