[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 160

 
extern double SL=100,TP=200,Tral=0,steps=2,Level=100;
extern int TF1=0,TF2=60,TF3=240,per1=14,per2=14,per3=14,shiftbars=20;
double sl,tp,cci[3],lastbar,lastpos=-1,lot=0.1,x=0.0001,calc,price,lb;
int init(){if(SL<Tral)SL=Tral;if(MarketInfo(Symbol(),MODE_DIGITS)==3)x=0.01; TP*=x;SL*=x;Tral*=x;calc=MathPow(2,steps)*0.1;}

double lot(){int l;double lotiki=0.1;bool isit=false;
for(int i=1;i<=steps;i++){
if(!OrderSelect(OrdersHistoryTotal()-i,SELECT_BY_POS,MODE_HISTORY))break;
if(OrderProfit()>0) lotiki*=2;l++;
if(OrderLots()==calc) {isit=true;break;}
if(OrderProfit()<0) break;}
if(l==steps+1 || isit)lotiki=0.1;
return(lotiki);}

int Trailing()
{double Tip,SL1;
for(int i=OrdersTotal()-1;i>=0;i--){
OrderSelect(i,SELECT_BY_POS);if(OrderMagicNumber()==350000){
Tip=OrderType();SL1=OrderStopLoss();
if(Tip==0) {if(Bid-SL1>Tral) {OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Tral,OrderTakeProfit(),0);break;}}
if(Tip==1) {if(SL1-Ask>Tral) {OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Tral,OrderTakeProfit(),0);break;}}
}}}

int Closeorders(){
for(int i=OrdersTotal()-1;i>=0;i--){OrderSelect(i,SELECT_BY_POS);if(OrderMagicNumber()==350000)
{if(OrderType()==0)price=Bid;else price=Ask; OrderClose(OrderTicket(),OrderLots(),price,50);break;}}
}
void start(){
//if(iBarShift(NULL,0,lastbar,false)==0)return;
//lastbar=CurTime();
if(OrdersTotal()!=0 && Tral!=0){Trailing();}
//cci=iCustom(NULL,0,"i-3CCI-h3",CCI_Period_0,Level_0,TF_1,CCI_Period_1,Level_1,TF_2,CCI_Period_2,Level_2,1000,-1,0,0);
cci[0]=iCCI(NULL,TF1,per1,0,1);
cci[1]=iCCI(NULL,TF2,per2,0,0);
cci[2]=iCCI(NULL,TF3,per3,0,0);
string s1="cci-0 *** "+DoubleToStr(cci[0],3);
string s2="cci-1 *** "+DoubleToStr(cci[1],3);
string s3="cci-2 *** "+DoubleToStr(cci[2],3);
string str[3];
str[0]=s1;
str[1]=s2;
str[2]=s3;
color col=Lime;
     for(int y=0;y<3;y++)
     {ObjectCreate("textSignal"+y,OBJ_LABEL,0,0,0,0,0);    
      ObjectSet("textSignal"+y,OBJPROP_CORNER,1);
      ObjectSet("textSignal"+y,OBJPROP_XDISTANCE,35-25);
      ObjectSet("textSignal"+y,OBJPROP_YDISTANCE,y*(20)+20+8);
      if(cci[y]>=0)col=Lime;else col=Red;
      if(cci[y]>Level) col=Aqua;
      if(cci[y]<-Level) col=DarkViolet;
      ObjectSetText("textSignal"+y,str[y],15,"Tahoma",col);
     }
if(OrdersTotal()!=0)return;
if(cci[0]>Level && cci[1]>Level && cci[2]>Level && (/*iBarShift(NULL,0,lb,false)>shiftbars || */lastpos!=0))
{Closeorders();tp=Ask+TP;sl=Ask-SL;if(TP==0)tp=0;if(SL==0)sl=0;
OrderSend(Symbol(),0,lot(),Ask,50,sl,tp,"i-3CCI-h3_Buy",350000,0);lastpos=0;lb=Time[0];}
if(cci[0]<-Level && cci[1]<-Level && cci[2]<-Level && (/*iBarShift(NULL,0,lb,false)>shiftbars || */lastpos!=1))
{Closeorders();tp=Bid-TP;sl=Ask+SL;if(TP==0)tp=0;if(SL==0)sl=0;
OrderSend(Symbol(),1,lot(),Bid,50,sl,tp,"i-3CCI-h3_Sell",350000,0);lastpos=1;lb=Time[0];}
}
Пожалйста помогите.

Если при визуальном тестировании советника 1.mq4(прилагается) натянуть на график индикатор 3-cci-h3(прилагается), то, какзалось бы, при абсолютно одинаковых параметрах расчитываемых cci сигналы индикатора и фактические cci(объектным текстом в правом верхнем углу) не совпадают.

ПОЧЕМУ?

И почему то не работают алерты в этом индюке.

Код советника:





Код индикатора:

//+------------------------------------------------------------------+
//| i-3CCI-h.mq4 |
//| johnfantom & KimIV |
//| http://www.kimiv.ru |
//| |
//| 02.01.2006 CCI с 3-х ТФ в одном флаконе. |
//+------------------------------------------------------------------+
#property copyright "johnfantom & KimIV"
#property link "http://www.kimiv.ru"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 DodgerBlue
#property indicator_maximum 1.4
#property indicator_level1 0
#property indicator_minimum -1.2

//------- Внешние параметры индикатора -------------------------------
extern int CCI_Period_0 = 14; // Период CCI для текущего ТФ
extern int Level_0 = 100; // Уровень CCI для текущего ТФ
extern int TF_1 = 60; // Количество минут первого ТФ
extern int CCI_Period_1 = 14; // Период CCI для первого ТФ
extern int Level_1 = 100; // Уровень CCI для первого ТФ
extern int TF_2 = 240; // Количество минут второго ТФ
extern int CCI_Period_2 = 14; // Период CCI для второго ТФ
extern int Level_2 = 100; // Уровень CCI для второго ТФ
extern int NumberOfBars = 1000; // Количество баров обсчёта (0-все)
extern int ExtBars=3;
int per;


//------- Буферы индикатора ------------------------------------------
double buf0[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
void init() {
IndicatorDigits(1);

SetIndexBuffer(0, buf0);
SetIndexLabel (0, "i-3CCI-h");
SetIndexStyle (0, DRAW_HISTOGRAM, STYLE_SOLID, 2);
SetIndexEmptyValue(0, 0);
}

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
void deinit() {
Comment("");
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
void start() {
double cci0, cci1, cci2;
int nb1, nb2,count;
int LoopBegin, sh;


if (NumberOfBars==0) LoopBegin=Bars-1;
else LoopBegin=NumberOfBars-1;
LoopBegin=MathMin(Bars-1, LoopBegin);
count=IndicatorCounted();
for (sh=count; sh>=0; sh--) {
nb1=iBarShift(NULL, TF_1, Time[sh+1], False);
nb2=iBarShift(NULL, TF_2, Time[sh+1], False);

cci0=iCCI(NULL, 0, CCI_Period_0, PRICE_CLOSE, sh+1);
cci1=iCCI(NULL, TF_1, CCI_Period_1, PRICE_CLOSE, nb1);
cci2=iCCI(NULL, TF_2, CCI_Period_2, PRICE_CLOSE, nb2);
/* double cci[3];
cci[0]=cci0;
cci[1]=cci1;
cci[2]=cci2;
string s1="cci-0 *** "+DoubleToStr(cci[0],3);
string s2="cci-1 *** "+DoubleToStr(cci[1],3);
string s3="cci-2 *** "+DoubleToStr(cci[2],3);
string str[3];
str[0]=s1;
str[1]=s2;
str[2]=s3;
color col=Lime;
for(int y=0;y<3;y++)
{ObjectCreate("textSignal"+y,OBJ_LABEL,0,0,0,0,0);
ObjectSet("textSignal"+y,OBJPROP_CORNER,1);
ObjectSet("textSignal"+y,OBJPROP_XDISTANCE,35-25);
ObjectSet("textSignal"+y,OBJPROP_YDISTANCE,y*(20)+20+8);
if(cci[y]>=0)col=Lime;else col=Red;
if(cci[y]>Level_0) col=Aqua;
if(cci[y]<-Level_0) col=DarkViolet;
ObjectSetText("textSignal"+y,str[y],15,"Tahoma",col);
}
*/
if (cci0>Level_0 && cci1>Level_1 && cci2>Level_2) {buf0[sh]=1;
if (per != Time[0]) {per = Time[0];
if(sh<=ExtBars && ExtBars!=-1)
Alert(Symbol(),Period()," ",
TimeYear(Time[sh]),".",
TimeDay(Time[sh]),".",
TimeMonth(Time[sh]),"; ",
TimeHour(Time[sh]),":",
TimeMinute(Time[sh])," ",
"Покупка");}}
if (cci0<-Level_0 && cci1<-Level_1 && cci2<-Level_2) {buf0[sh]=-1;
if (per != Time[0]) {per = Time[0];
if(sh<=ExtBars && ExtBars!=-1)
Alert(Symbol(),Period()," ",
TimeYear(Time[sh]),".",
TimeDay(Time[sh]),".",
TimeMonth(Time[sh]),"; ",
TimeHour(Time[sh]),":",
TimeMinute(Time[sh])," ",
"Продажа");}}
}
}
//+------------------------------------------------------------------+
 

Попробуйте у себя плиз. у мну чего то не получается вообще. Фуфло рисует.

По идее, линии должны совпадать. А на практике немного иначе получается.

int start()
  {
   int    counted_bars=IndicatorCounted();
//----
   ObjectCreate("fibowhite",OBJ_TRENDBYANGLE,0,0,0,0,0);
   //ObjectSet("fibowhite",OBJPROP_ANGLE,angle_);
   ObjectSet("fibowhite",OBJPROP_TIME1,Time[5]);
   ObjectSet("fibowhite",OBJPROP_TIME2,Time[1]);
   ObjectSet("fibowhite",OBJPROP_PRICE1,Low[5]);
   ObjectSet("fibowhite",OBJPROP_PRICE2,Low[1]);
   ObjectSet("fibowhite",OBJPROP_COLOR,Red);
   //----------------------------------------------------------
   ObjectCreate("fibowhite1",OBJ_TRENDBYANGLE,0,0,0,0,0);
   ObjectSet("fibowhite1",OBJPROP_TIME1,Time[5]);
   //ObjectSet("fibowhite1",OBJPROP_TIME2,Time[1]);
   ObjectSet("fibowhite1",OBJPROP_PRICE1,Low[5]);
   //ObjectSet("fibowhite1",OBJPROP_PRICE2,Low[1]);
   ObjectSet("fibowhite1",OBJPROP_COLOR,Green);
   WindowRedraw();
   double awd=ObjectGet("fibowhite",OBJPROP_ANGLE);
   Comment("AngleRED= ",ObjectGet("fibowhite",OBJPROP_ANGLE),"\nAngleWHITE= ",ObjectGet("fibowhite1",OBJPROP_ANGLE));
   ObjectSet("fibowhite1",OBJPROP_ANGLE,ObjectGet("fibowhite",OBJPROP_ANGLE));
   
//----
   return(0);
  }
 

Подскажите пожалуйста, в чем может быть ошибка?

Сделал рекурсивную функцию, пишущую значение в буфер.

при вызове из индиктаора работает нормально, когда попробовал её воткнуть в советника - ответ 0

В чем может быть дело?

 
Andrej78 писал(а) >>

Подскажите пожалуйста, в чем может быть ошибка?

Сделал рекурсивную функцию, пишущую значение в буфер.

при вызове из индиктаора работает нормально, когда попробовал её воткнуть в советника - ответ 0

В чем может быть дело?

мож у буфера размер не задан!?

 

Нашел где возникает затык.

Оказывается в IndicatorCounted в индикаторе выдает 0, а в советнике -1 (в ф-ии есть проверка на корректность - чтобы был>=0, потому в советнике и не считается)

Из-за чего это бывает и как убрать ошибку?

MT4 билд 225, пара eurusd M1.

 
Andrej78 писал(а) >>

Нашел где возникает затык.

Оказывается в IndicatorCounted в индикаторе выдает 0, а в советнике -1 (в ф-ии есть проверка на корректность - чтобы был>=0, потому в советнике и не считается)

Из-за чего это бывает и как убрать ошибку?

MT4 билд 225, пара eurusd M1.

https://docs.mql4.com/ru/customind

 

  if (k>k1+7 && s<(High[1]-(High[1]-Low[1])/2) && bay==true) 
  {
  int t=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,NULL,NULL,"My order #",16384,0,Green); 
  bay=false;
  Print (GetLastError());
  }
  }
  if (s>(High[0]-(High[0]-Low[0])/2) && bay==false)
  {
  OrderSelect(t,SELECT_BY_TICKET,MODE_TRADES);
  Print (GetLastError());
  OrderClose(t,0.1,Ask,5,Red);
  }

в чем здесь ошибка выдает в журнал код 4051 не правельный тикет при закрытии ордера подскажите плиз ??
 
evgenio писал(а) >>

if (k>k1+7 && s<(High[1]-(High[1]-Low[1])/2) && bay==true)
{
int t=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,NULL,NULL,"My order #",16384,0,Green);
bay=false;
Print (GetLastError());
}
}
if (s>(High[0]-(High[0]-Low[0])/2) && bay==false)
{
OrderSelect(t,SELECT_BY_TICKET,MODE_TRADES);
Print (GetLastError());
OrderClose(t,0.1,Ask,5,Red);
}

в чем здесь ошибка выдает в журнал код 4051 не правельный тикет при закрытии ордера подскажите плиз ??

Открытие и закрытие происходит на разных тиках. И советник уже не помнит что было когда-то присвоено переменной t. Или надо ее сделать глобальной, или статичной.

Глобальная определяется вне функций. Или объявить как static int

 
Vinin >>:

Открытие и закрытие происходит на разных тиках. И советник уже не помнит что было когда-то присвоено переменной t. Или надо ее сделать глобальной, или статичной.

Глобальная определяется вне функций. Или объявить как static int

точно спасибо заработался и забыл ))

 

В Индикаторе задаю (чтобы затем сравнить их с Time[i]):

extern datetime StartRange          = D'1970.12.24';
extern datetime EndRange            = D'2020.12.24';


Затем в цикле

   Comment(
      "\n", "Time[i]                = "   , Time[i],
      "\n", "StrToTime(StartRange)  = "   , StrToTime(StartRange),
      "\n", "StrToTime(EndRange)    = "   , StrToTime(EndRange),
   "\n" );


В результате StrToTime(StartRange) и StrToTime(EndRange) выдают Нули.

- Почему и как это исправить?

Причина обращения: