Ваши вопросы по языку MQL4

eevviill2

Местный знаток
Добрый день всем!)
Подскажите пожалуйста как в код вставить ещё и секунды?
Заранее благодарю!)
PHP:
extern string Time_Start          = "12:35";           //Начало подачи сигналов  
extern string Time_End            = "15:50";           //Конец  подачи сигналов 

//----

for(i = 1; i <= limit; i++) 
   {  
     string Time_S=TimeToStr(StrToTime(Time_Start),TIME_MINUTES); 
     string Time_E=TimeToStr(StrToTime(Time_End),TIME_MINUTES);
     string Time_i=TimeToStr(Time[i],TIME_MINUTES);
PHP:
"12:35:00"
Подсказка.
В mql4 можно сравнивать string.
PHP:
 string Time_S=TimeToStr(StrToTime(Time_Start),TIME_MINUTES); 
     string Time_E=TimeToStr(StrToTime(Time_End),TIME_MINUTES);
этого не надо
 

блондинка

Элитный участник
PHP:
"12:35:00"
Подсказка.
В mql4 можно сравнивать string.
PHP:
 string Time_S=TimeToStr(StrToTime(Time_Start),TIME_MINUTES); 
     string Time_E=TimeToStr(StrToTime(Time_End),TIME_MINUTES);
этого не надо
Спасибо что откликнулись)
Там рабочая строчка сравнения выглядит так:
PHP:
 if (Time_S < Time_E && Time_i >= Time_S && Time_i <= Time_E)
Если по другому написать (по вашему предложению)то не работает.
Вроде все варианты испробовала.
Пожалуйста напишите эту строчку следуя вашей рекомендации.
 

оn220

Интересующийся
Здрасти!Подскажите почему селлы только работают,а бай не хочет,вообще не открываются ордера.Но если убрать LastOpenPriceBay >Ask,то открываются,но не так как хотелось бы.
PHP:
   int start()
   {  
  if (TimeBar==Time[0])  return(0);

     double FF10=iCustom(Symbol(),0,"new\\FEN 1",MA_1,MA_Mode_1,Price_Type_1,Band_MA_1,SD_1,1,1);
     double FF11=iCustom(Symbol(),0,"new\\FEN 1",MA_1,MA_Mode_1,Price_Type_1,Band_MA_1,SD_1,1,2);
     double FF20=iCustom(Symbol(),0,"new\\FEN 1",MA_1,MA_Mode_1,Price_Type_1,Band_MA_1,SD_1,2,1);
     double FF21=iCustom(Symbol(),0,"new\\FEN 1",MA_1,MA_Mode_1,Price_Type_1,Band_MA_1,SD_1,2,2);
      
 double SL,TP;
  double LastOpenPriceBay = 0.0;
    double LastOpenPriceSell = 0.0; 
     
      for(int i=OrdersTotal()-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) 
          if(OrderSymbol()==Symbol())
           if(OrderType() == OP_BUY)
         {
           LastOpenPriceBay = OrderOpenPrice();
           break;
         } 
          if(OrderType() == OP_SELL)
         {
           LastOpenPriceSell = OrderOpenPrice();
           break;
         } 
    }       
         
      if (LastOpenPriceBay >Ask&&FF20<FF21)
      {
       TimeBar=Time[0];                            
      if (takeprofit!=0) TP  = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP = 0; 
      if (stoploss!=0)   SL  = NormalizeDouble(Bid - stoploss*Point,Digits); else SL = 0;
      bay =OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,Digits),slip,SL,TP,"o",123,3);     
     }
     
     if (LastOpenPriceSell<Bid && FF10<FF11) 
    { 
      TimeBar=Time[0];                           
      if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP = 0; 
      if (stoploss!=0)   SL = NormalizeDouble(Ask + stoploss*Point,Digits); else SL = 0;
      sell=OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,Digits),slip,SL,TP,"o",321,3); 
     }  
     
     return(0);
     }
 

vladradon

Программист
Здрасти!Подскажите почему селлы только работают,а бай не хочет,вообще не открываются ордера.Но если убрать LastOpenPriceBay >Ask,то открываются,но не так как хотелось бы.
Для начала нужно добавить еще 2 кривые скобки:
PHP:
     for(int i=OrdersTotal()-1;i>=0;i--) 
        { 
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)  
          if(OrderSymbol()==Symbol())
            { 
             if(OrderType() == OP_BUY) 
              { 
               LastOpenPriceBay = OrderOpenPrice(); 
               break; 
              }  
            if(OrderType() == OP_SELL) 
             { 
              LastOpenPriceSell = OrderOpenPrice(); 
              break; 
             }
           }  
        }
А при проверке последнего прайса добавить проверку на его ненулевое значение:
PHP:
     if (LastOpenPriceBay>0.0 && LastOpenPriceBay >Ask && FF20<FF21) 
      { 
       TimeBar=Time[0];                             
      if (takeprofit!=0) TP  = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP = 0;  
      if (stoploss!=0)   SL  = NormalizeDouble(Bid - stoploss*Point,Digits); else SL = 0; 
      bay =OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,Digits),slip,SL,TP,"o",123,3);     
     } 
      
     if (LastOpenPriceSell>0 && LastOpenPriceSell<Bid && FF10<FF11)  
    {  
      TimeBar=Time[0];                            
      if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP = 0;  
      if (stoploss!=0)   SL = NormalizeDouble(Ask + stoploss*Point,Digits); else SL = 0; 
      sell=OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,Digits),slip,SL,TP,"o",321,3);  
     }
Для баевского открытия может и не повлияет, а вот для селла - если даже прайс будет 0 (не расчитан ранее) LastOpenPriceSell<Bid сработает, чего быть не должно.
 
Последнее редактирование:

оn220

Интересующийся
vladradon,Все равно не открываются,только теперь и селы не работают так же как и баи вообще не открываются.
 

оn220

Интересующийся
Владрадон скобки кривые поставил,открываются также только селлы.Баи не хотят.Добавил прайсы >0 в условия,перестают открываться и бай и сел.
 

vladradon

Программист
Владрадон скобки кривые поставил,открываются также только селлы.Баи не хотят.Добавил прайсы >0 в условия,перестают открываться и бай и сел.
Скинь мне код в личку или в скайп. Из того, что ты предоставил в плане кода - все должно работать. Может есть косяки еще где-то в твоем коде помимо этого...))
 

оn220

Интересующийся
vladradon,Вот весь код(точнее шапка кода того),ничего там нет вроде.С другим индюком таже проблема.(В командировке был,извеняюсь за столь долгий ответ).
PHP:
   extern int     MA_1           =10;
   extern int     MA_Mode_1      =3;
   extern int     Price_Type_1   =6;
   extern int     Band_MA_1      =20;
   extern int     SD_1           =1;

   extern int     takeprofit     = 0;  
   extern int     stoploss       = 0;
 
   extern int slip               = 3;
   extern double  Lots           = 0.1;     

   int bay=0,sell=0,Magic=1234567890;
   datetime TimeBar;
 

eevviill2

Местный знаток
:D
PHP:
double LastOpenPriceBay = 0.0; 
    double LastOpenPriceSell = 0.0;  
      
      for(int i=OrdersTotal()-1;i>=0;i--) 
        { 
         if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))  continue;
          if(OrderSymbol()!=Symbol()) continue;

           if(OrderType() == OP_BUY && LastOpenPriceBay==0) LastOpenPriceBay = OrderOpenPrice(); 
 
          if(OrderType() == OP_SELL && LastOpenPriceSell==0) LastOpenPriceSell = OrderOpenPrice(); 

      if(LastOpenPriceBay!=0 && LastOpenPriceSell!=0) break;
    }
 

оn220

Интересующийся
vladradon,Сделал так (ниже) все заработало на EURUSD и бай и селл.(Изначально тестил,только на EURUSD).Сейчас тестируя на USDCHF тоже все работает.Но,меняю double LOPB =1; на EURUSD баи снова не работают;а на USDCHF при этом все работает.Вообщем беда для меня.
PHP:
 int start() 
   {   
  if (TimeBar==Time[0])  return(0); 

     double FF10=iCustom(Symbol(),0,"new\\FEN 1",MA_1,MA_Mode_1,Price_Type_1,Band_MA_1,SD_1,1,1);
     double FF11=iCustom(Symbol(),0,"new\\FEN 1",MA_1,MA_Mode_1,Price_Type_1,Band_MA_1,SD_1,1,2);
     double FF20=iCustom(Symbol(),0,"new\\FEN 1",MA_1,MA_Mode_1,Price_Type_1,Band_MA_1,SD_1,2,1);
     double FF21=iCustom(Symbol(),0,"new\\FEN 1",MA_1,MA_Mode_1,Price_Type_1,Band_MA_1,SD_1,2,2);
       
 double SL,TP; 
 
      if (LastOpenPriceBay() >Ask&&FF20<FF21) 
      { 
       TimeBar=Time[0];                             
      if (takeprofit!=0) TP  = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP = 0;  
      if (stoploss!=0)   SL  = NormalizeDouble(Bid - stoploss*Point,Digits); else SL = 0; 
      bay =OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,Digits),slip,SL,TP,"o",123,3);     
     } 
      
     if (LastOpenPriceSell()<Bid && FF10<FF11)  
    {  
      TimeBar=Time[0];                            
      if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP = 0;  
      if (stoploss!=0)   SL = NormalizeDouble(Ask + stoploss*Point,Digits); else SL = 0; 
      sell=OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,Digits),slip,SL,TP,"o",321,3);  
     }   
      
     return(0); 
     }  
     
 double LastOpenPriceBay()
  {
     double  LOPB =2; 
   
   for(int i=OrdersTotal()-1;i>=0;i--) 
        { 
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)== true)  
          if(OrderSymbol()==Symbol()&& OrderMagicNumber()==123)
          {         
            if(OrderType() == OP_BUY) 
             { 
              LOPB = OrderOpenPrice(); 
              break;
             }
           }
         }
return(LOPB);
}

 double LastOpenPriceSell()
  {
     double  LOPS =0; 
   
   for(int i=OrdersTotal()-1;i>=0;i--) 
        { 
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)== true)  
          if(OrderSymbol()==Symbol()&& OrderMagicNumber()==321)
          {         
            if(OrderType() == OP_SELL) 
             { 
              LOPS = OrderOpenPrice(); 
              break;
             }
           }
         }
return(LOPS);
}
 

оn220

Интересующийся
А может быть такое что я не с ярлыка снимаю для загрузки терминала.А из папки левой.Хотя врядли пароль то тотже как и номер счета.
 

yarik19

Интересующийся
Спасибо что откликнулись)
Там рабочая строчка сравнения выглядит так:
PHP:
 if (Time_S < Time_E && Time_i >= Time_S && Time_i <= Time_E)
Если по другому написать (по вашему предложению)то не работает.
Вроде все варианты испробовала.
Пожалуйста напишите эту строчку следуя вашей рекомендации.


А что вы хотите сделать? Объясните на словах.
 

vladradon

Программист
блондинка,
Спасибо,код уже нашла.
а задача стояла установить интервал времени появления сигнала от индикатора включая не только часы и минуты но и секунды.
Проблема частенько заключается не в том, что спецы не могут помочь, а в том, что либо не правильно формируется задача, либо не понятно, в чем состоит в итоге достигаемый результат. Все тонкости достигаются точной математикой, которая уже достигается опытом и наработками прогера. Каждый вопрос можно по-разному решить, но вариации могут быть совсем разные - все зависит от от того, какой в итоге нужен расчет. Я не гружу полемикой - все зависит от задачи и если в тех задании нет идеально точных параметров, то и результаты могут координально отличаться от предполагаемых.
Можно получить результат 2 делением 4 на 2 или корнем квадратным из 144-х, деленным на 6;):)
Это я имея ввиду то, что для каждого случая есть свой расчет.:)
 
Последнее редактирование:

nurfirdaus

Новичок форума
кто-то может помочь мне привести примеры кодов, которые могут запомнить последний крест сигнала, например, последний стохастический сигнал является перекрестным, а текущий сигнал - ничем.

это использование для советника.
 

nurfirdaus

Новичок форума
пожалуйста, помогите мне, как сохранить последний скрещенный сигнал.

PHP:
   macdNow  = iMACD(NULL, timeframe, fast_ema_period, slow_ema_period, signal_period, applied_price, MODE_MAIN, shift);
	macdPre2 = iMACD(NULL, timeframe, fast_ema_period, slow_ema_period, signal_period, applied_price, MODE_MAIN, shift+1);
	signNow  = iMACD(NULL, timeframe, fast_ema_period, slow_ema_period, signal_period, applied_price, MODE_SIGNAL, shift);
	signPre2 = iMACD(NULL, timeframe, fast_ema_period, slow_ema_period, signal_period, applied_price, MODE_SIGNAL, shift+1);
// ------------------------------------------------------------------------------------------------
//
// ------------------------------------------------------------------------------------------------
int Crossed() {
	int direction = 0;

	if(macdNow < -0.004) {
		direction = 1; //up
	}
	else if (macdNow > 0.004) {
		direction = -1; //down
	}
	else if (macdNow < 0.001) {
	   direction = 0; // none
	}
	else if (macdNow > -0.001) {
	   direction = 0; // none
	}
	return (direction);
}
// ------------------------------------------------------------------------------------------------
//
// ------------------------------------------------------------------------------------------------
datetime LastCrossed() {
	static datetime last_Crossed = 0;

	if(Crossed() == 1) {
		last_Crossed = 1; //up 
	}
	else if (Crossed() == -1) {
		last_Crossed = -1; //down
	}
	else if (Crossed() == 0) {
		last_Crossed = 0; //none
	}
	return (last_Crossed);
}
// ------------------------------------------------------------------------------------------------
//
// ------------------------------------------------------------------------------------------------
int GetSignal() {
	int Signal = 0;

	if(macdNow > signNow && macdPre2 < signPre2 && LastCrossed() > 0 && macdPre2 < 0) {
		Signal = 1; // buy
	}

	if(macdNow < signNow && macdPre2 > signPre2 && LastCrossed() < 0 && macdPre2 > 0) {
		Signal = -1; // sell
	}

	return(Signal);
}
 
Последнее редактирование:
Верх