[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 415

 
Neo777:

Вот советник нужно сделать так чтобы ордер открывался по ЗАКРЫТИЮ свечи,а не просто по пересечению.

Кто чем поможет заранее спасибо.


А как вы планируете узнать что бар закроется этим тиком? Может все-таки по открытию нового бара?

код вставляется кнопкой SRC

 
 
Neo777:

ок.

Да нового бара

https://www.mql5.com/ru/articles/1494 тут описаны способы определения, что начался новый бар. Как начался - проверяйте ваши условия
 

Доброго времени суток.Люди, кто-нибудь, помогите разобраться с функцией WindowScreenShot. 3-й день никто не отвечает((. Написал скрипт следующего содержания (см. приложенный файл).

В 2 словах о скрипте. Скрипт предназначен для создания скриншотов текущего графика окна клиентского терминала.Во внешней переменной extern datetime Время_бара задается время бара, начиная с которого и вплоть до нулевого бара будет создан скриншот (с учетом правого отступа на графике). В строке

int bar_number=iBarShift(NULL,0,Время_бара,true)

ищется порядковый номер бара, заданного во внешней переменной строкой extern datetime Время_бара. И уже непосредственно в самой функции, в строке

bool f=WindowScreenShot(name+".gif",1024,768,bar_number,Масштаб,Вид_графика)

Теперь собственно вопрос... Для простоты предположим, что надо создать скриншот двух последних баров. Тогда, если строку

int bar_number=iBarShift(NULL,0,Время_бара,true)

оставить без изменений, то получим такой скриншот


То есть ни одного бара на скриншоте нет (хотя в строке

int bar_number=iBarShift(NULL,0,Время_бара,true)

должен был быть вычислен номер бара по времени)

Если же данную строку представить следующим образом

int bar_number=iBarShift(NULL,0,Время_бара,true)+2

то получим тот скриншот, к-й и хотели:

Вопрос: почему в случае, если эта строка строка имеет вид

int bar_number=iBarShift(NULL,0,Время_бара,true)

скриншот делается со сдвигом на 2 бара вправо от заданного в вышеуказанной строке?

P.S. Чтобы не захламлять форум, заранее благодарю за ответ

Файлы:
 
ilunga:
покажите код + какие в индикаторе входные параметры

Ну так я ж сам все проверил 20 раз, не проверив 20 раз не писал бы, все параметры верно введены как в индикаторе. Проблема наверно кроется в другом, может кто сталкивался с такой проблемой?
 

Коллеги!! добрый вечер!

Открыл для себя удивительный индикатор QQE! и решил найти советника на основе этого индикатора....и не смог найти. Однако на этом форуме нашел сообщение от юзера POZITIV.

Он закладывал такую логику:" когда красная линия пересекает жёлтую снизу вверх, должен открыться один ордер на Buy, когда красная пересекает жёлтую вверху вниз -- один ордер на Sell".

В итоге он выложил полуготовый код советника.

Я же вычислил для себя другую логику: когда жирная кривая пересекает пунктирную сверху вниз - надо продавать и закрывать этот лот (покупать), когда жирная красная пересекает пунктурную снизу вверх. Причем в этот же момент открывать сразу другой лот (покупать), который закрывать (продавать) когда происходит противоположная ситуация.....вообщем постоянно открыт один лот, и каждое пересечение линий используется для закрытия одного и одновременно открытия другого лота. Причем пересечением наверно стоит считать по их значениям после закрытия одного бара, ну т.е. если на 20 минуте (после закрытия) жирная имела значение 51 (Условно), а пунктирная 50, а на 21 минуте (после закрытия) жирная 50, а пунктирная 51, то надо продавать. Никаких СЛ и ТК.

В принципе логика простая. Никаких стрелок, никаких алармов и сообщений. ТОлько торговля в автоматическом режиме в чистом виде

Помогите пожалуйста доработать этот код (ниже приведенный) до такой логики. Причем так, чтобы можно было бы в коде настраивать период (от 1 минуты до 1 дня) и параметр SF (сглаживание).

Уже второй день пытаюсь понять код и поправить его, но я не программист(((((((((((


Очень надеюсь на вашу помощь!

//--- input parameters
extern double MaxRisk=1.0;
extern double FixLot = 0.01;
extern double Exponent=2.0;
extern int Magic=888;

// костыли

extern int TakeProfit=100;
extern int StopLoss=100;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
//----

//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
//----
   int Count=0;
   double b0,b1;
   int ticket;

// параметры индикатора
   int SF=5; // original 5
   int RSI_Period=14; // original 14
   double DARFACTOR=4.236; //original 4.236

//------------ Параметры из индикатора QQEA -----------------------
// Buffer0 -- красная жирная
   string Buffer0=iCustom(NULL,0,"QQEA",SF,RSI_Period,DARFACTOR,0,0);
// Buffer1 -- жёлтый пунктир
   string Buffer1=iCustom(NULL,0,"QQEA",SF,RSI_Period,DARFACTOR,1,0);

   b0=StrToDouble(Buffer0);
   b1=StrToDouble(Buffer1);


   double Lot=GetLot(MaxRisk);
// если лот <0 выводим сообщение об ошибке
   if(Lot==0)
     {
      Alert("Недостаточно средств!");
      return(0);
     }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
   if(Lot!=0 && b0>b1) // если лот <> 0 и красная выше жёлтой
     {
      ticket=NewOrder(OP_BUY,Lot);
      if(ExistOrders(Symbol(),1,888,0)==true) // проверяем наличие ордера sell
        {
         CloseOrder();
        }
     }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
   if(Lot!=0 && b0<b1) // если лот <> 0 и красная выше жёлтой
     {
      ticket=NewOrder(OP_SELL,Lot);
      if(ExistOrders(Symbol(),0,888,0)==true) // проверяем наличие ордера buy
        {
         CloseOrder();
        }
     }

   Comment("Red line: ",b0,"Yellow line: ",b1);
   return(0);
  }
//-------------------------------------------------------------
//расчёт лота

double GetLot(int Risk)
  {
   double Free=AccountFreeMargin();
   double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
   double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
   double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
   double Step=MarketInfo(Symbol(),MODE_LOTSTEP);
   double Lot =MathFloor(Free*Risk/100/One_Lot/Step)*Step;
   if(Lot<Min_Lot) Lot=Min_Lot;
   if(Lot>Max_Lot) Lot=Max_Lot;
   if(Lot*One_Lot>Free) return(0.0);
   return(Lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool ExistOrders(string sy="",int op=-1,int Magic=-1,datetime ot=0)
  {
   int i,k=OrdersTotal(),ty;

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++)
      //+------------------------------------------------------------------+
      //|                                                                  |
      //+------------------------------------------------------------------+
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         ty=OrderType();
         if(ty>1 && ty<6)
           {
            if((OrderSymbol()==sy || sy=="") && (op<0 || ty==op))
              {
               if(Magic<0 || OrderMagicNumber()==Magic)
                 {
                  if(ot<=OrderOpenTime()) return(True);
                 }
              }
           }
        }
     }
   return(False);
  }
//открытие нового ордера
int NewOrder(int Cmd,double Lot)
  {
   double TP=0; //тейкпрофит
   double SL=0; //стоплосс
   double PR=0; //Цена
   while(!IsTradeAllowed()) Sleep(100);
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
   if(Cmd==OP_BUY)
     {
      PR=Ask;
      if(TakeProfit>0) TP=Ask+TakeProfit*Point;
      if(StopLoss>0) SL=Ask-StopLoss*Point;
     }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
   if(Cmd==OP_SELL)
     {
      PR=Bid;
      if(TakeProfit>0) TP=Bid-TakeProfit*Point;
      if(StopLoss>0) SL=Bid+StopLoss*Point;
     }
   if(GetOrdersCount(Magic,Cmd)>0)return(0);
   int tic=OrderSend(Symbol(),Cmd,Lot,PR,3,SL,TP," ",0,0,Green);
   if(tic<0) Print("Ошибка открытия ордера: ",GetLastError());
   return(tic);
  }
// закрытие ордера
void CloseOrder()
  {
   double PR=0;
   while(!IsTradeAllowed()) Sleep(100);
   if(OrderType()==OP_BUY) PR=Bid;
   if(OrderType()==OP_SELL) PR=Ask;
   if(!OrderClose(OrderTicket(),OrderLots(),PR,3,Red))
      Print("Ошибка закрытия ордера: ",GetLastError());
   return;
  }
//+------------------------------------------------------------------+
// подсчет кол-ва открытых позиций
int GetOrdersCount(int MagicNumber,int Type)
  {
   int count=0;

   for(int i=0; i<OrdersTotal(); i++)
     {
      // already closed
      if(OrderSelect(i,SELECT_BY_POS)==false) continue;
      // not current symbol
      if(OrderSymbol()!=Symbol()) continue;
      // order was opened in another way
      if(OrderMagicNumber()!=MagicNumber) continue;

      if(OrderType()==Type)
        {
         count++;
        }
     }

   return(count);
  }
//-------------------------------------------------------
 
sss2019:

Ну так я ж сам все проверил 20 раз, не проверив 20 раз не писал бы, все параметры верно введены как в индикаторе. Проблема наверно кроется в другом, может кто сталкивался с такой проблемой?
Ничего, кроме неверного введения параметров в iCustom и быть не может. Ищите.
Намедни сам вечер потратил на борьбу с ним. При переносе экстерн из индикатора в советник попутал последовательность параметров. Чуть с ума не сошел, количество-то совпадало :))
 
granit77:
Ничего, кроме неверного введения параметров в iCustom и быть не может. Ищите.
Намедни сам вечер потратил на борьбу с ним. При переносе экстерн из индикатора в советник попутал последовательность параметров. Чуть с ума не сошел, количество-то совпадало :))

iCustom(Symbol(),0,"RMRCS_entry-point"," ",5,6,7,62,-62,57,-57,54,-54,0.7,1.1,1.07," ",1,9,6,1,34,6,0,4,89,1,3,3.0,2.0,0.5,3.0," ",6,6,70,30,0.0,6,3.0," ",1,21,1,45,89,1,35,89,1,9," ",4,2,5,1," ",49,-49,0,0,0,0,0,0,0,0," ",0,34,200,150,1,100," ",1,3,1,1,2," ",1.4,3.7,0,1);


А вот параметры

extern string REI_str = "";
extern int REI1_Per=5; 
extern int REI2_Per=6;     
extern int REI3_Per=7;     
extern int REI1_up=62;    
extern int REI1_dn=-62;    
extern int REI2_up=57;     
extern int REI2_dn=-57;            
extern int REI3_up=54;     
extern int REI3_dn=-54;            
extern double REI1_ct=0.7;  
extern double REI2_ct=1.1;  
extern double REI3_ct=1.07;
extern string MACD_str = "";
extern int MACD_FastMA_Meth=1;   
extern int MACD_FastMA_Per=9;    
extern int MACD_FastMA_Price=6; 
extern int MACD_SlowMA_Meth=1;   
extern int MACD_SlowMA_Per=34; 
extern int MACD_SlowMA_Price=6; 
extern int MACD_SL_Meth=0;      
extern int MACD_SL_Per=4;       
extern int MACD_Diap_Per=89;    
extern int MACD_Slope_Meth=1;   
extern int MACD_Slope_Per=3;  
extern double MACD_ct_1 = 3.0; 
extern double MACD_ct_2 = 2.0;  
extern double MACD_ct_3 = 0.5;  
extern double MACD_ct_4 = 3.0;  
extern string RSI_str = "";
extern int RSI_Per = 6;     
extern int RSI_Price = 6;  
extern int RSI_up = 70;      
extern int RSI_dn = 30;     
extern double RSI_ct1 = 0.0; 
extern int RSI_ct2 = 6;      
extern double RSI_ct3 = 3.0;
extern string CHO_str = "";
extern int  CHO_FastMA_Meth=1;      
extern int  CHO_FastMA_Per=21;      
extern int  CHO_SlowMA_Meth=1;      
extern int  CHO_SlowMA_Per=45;      
extern int  CHO_DiapVal_Per=89;     
extern int  CHO_MADiapVal_Meth=1;   
extern int  CHO_MADiapVal_Per=35;    
extern int  CHO_SlopeDiapVal_Per=89;  
extern int  CHO_MASlope_Meth=1;      
extern int  CHO_MASlope_Per=9;       
extern string Stoch_str = "";
extern int Stoch_KPer=4;       
extern int Stoch_DPer=2;        
extern int Stoch_Slow=5;        
extern int Stoch_SL_MA_Meth=1; 
extern string EntryLevel_str = "";
extern int REI_SvS_up = 49;  
extern int REI_SvS_dn = -49; 
extern int MACD_SvS_up = 0; 
extern int MACD_SvS_dn = 0;  
extern int RSI_SvS_up = 0;  
extern int RSI_SvS_dn = 0; 
extern int CHO_SvS_up = 0;  
extern int CHO_SvS_dn = 0;  
extern int STO_SvS_up = 0; 
extern int STO_SvS_dn = 0;  
extern string EntryOther_str = "";
extern int MALgthBar_Meth=0;
extern int MALgthBar_Per=34;
extern int MAXLgthBar = 200;
extern int TtS_MinABS = 150; 
extern int Shift_Points = 1; 
extern int Start_Calc = 100;   
extern string EntryCondition = "";
extern bool Ban_InvEntry = true;    
extern int InvEntry_Bars = 3;        
extern bool Ban_TtS_Decline=true;   
extern bool Ban_Entry_Series = true; 
extern int MAX_Entry_Series=2;      
extern string Gen_str = ""; 
extern double DiapBar_CtSl = 1.4;
extern double TakeProf_CtSl = 3.7;
 
sss2019:
Скажите есть ли ограничение по числу параметров в нестандартном индикаторе, при подключении через iCustom?

У меня есть индикатор в котором около 8 параметров, ввожу все параметры верно, несколько раз проверил, но при компиляции все равно появляется ошибка ')' - wrong parameters count D:\InstaTrader\experts\Expert_2.mq4 (11, 280)

Я бы сказал "около 80"
 

Убери экстерн от части параметров, которые мало используются, и не будет путаницы.

Внимание мои вопросы:

Почему объекты бывают под свечами, чем это вызвано?

Не напомните как сделать флажок к цене, что за свойство объекта.

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