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

griz

Активный участник
Нужно чтобы, при появлении сигнала выставлялся 1 BUYSTOP?
 

mobidik

-----
Пробывал. Не подходит.
Так же пробывал свечу с другого тайфрейма. Не подходит.
Пробывал цену последнего ордера минус или плюс дистанцию в пунктах. Не подходит.
Пробывал время последнего ордера. Не подходит. :)
То, как Вам предложил MrGreen86 должно было подойти, раз не работает - тогда что-то не то с построителем данного ТФ.
 

MrGreen86

Гуру форума
Пробывал. Не подходит.
Так же пробывал свечу с другого тайфрейма. Не подходит.
Пробывал цену последнего ордера минус или плюс дистанцию в пунктах. Не подходит.
Пробывал время последнего ордера. Не подходит. :)
значит что-то делаете не так или что-то не учитываете.
вы задали вопрос, я вам на него ответил.
прикрепите ваш код и/или поясните чем именно не подходит
 

AlexeNP

Гуру форума
Как сделать чтобы при наличии одного сигнала и следующих сигналов к покупке продолжать открывать по одному BUYSTOP независимо от общего количества ордеров BUYSTOP
и возможно активированных ордеров BUY .?
вот это вот "... независимо от общего количества ордеров ..."
а если ДЦ против такого подхода?
 

AlexeyVik

Программист mql4 mql5
Пробывал. Не подходит.
Так же пробывал свечу с другого тайфрейма. Не подходит.
Пробывал цену последнего ордера минус или плюс дистанцию в пунктах. Не подходит.
Пробывал время последнего ордера. Не подходит. :)
Твоя проблема в сигнале. Представь сколько будет открыто ордеров если написать в качестве сигнала что одна МА выше другой МА. И этот сигнал будет сохраняться пока не произойдёт пересечение в другую сторону. Делай так, чтобы сигнал на следующем баре уже не был сигналом. Тогда можно будет поставить запрет открытия на баре на котором уже есть одно открытие.
 

sergeysv

Активный участник
должно было подойти, раз не работает - тогда что-то не то с построителем данного ТФ.
С эти всё нормально.
вот это вот "... независимо от общего количества ордеров ..."
а если ДЦ против такого подхода?
Не мой уровень..:)
значит что-то делаете не так или что-то не учитываете.
прикрепите ваш код и/или поясните чем именно не подходит
Так код работает почти как надо...
1 Сигнал = 1 Ордер
Если есть один BUYSTOP то по сигналу купить через 20 или 45 мин больше не открывает.Нужно чтоб открывал.

Код:
 extern int    Magic_15       = 8905;
 extern int    Slippage    = 3;
int      BuyPos=0,SellPos=0,bs=0,ss=0,iL;
void OnDeinit(const int reason)
{ 
   EventKillTimer();
}
int OnInit()
{EventSetMillisecondTimer(1500);
   return(INIT_SUCCEEDED);
}
void OnTimer(){
  
for (iL=OrdersTotal()-1;iL>=0;iL--)
     {
      if (OrderSelect(iL, SELECT_BY_POS,MODE_TRADES))
        { 
         if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic_15) continue;
         if (OrderType()==OP_BUYSTOP) bs++;
         if (OrderType()==OP_SELLSTOP) ss++;
         if (OrderType()==OP_BUY) BuyPos++;
         if (OrderType()==OP_SELL) SellPos++;                 
        } 
     }       
 if (   /* Сигнал купить*/ )
 {   
 if( bs== 0 && BuyPos == 0 )
 { 
 //     1 BUYSTOP     
    }
  D_S_DELL_15();  D_SS_del_15();  // Удаляем  OP_SELL и OP_SELLSTOP
  }

        
   if( bs == 0 && BuyPos > 0) {
    if( bs == 0) {
  if(    /* Сигнал купить*/ )
  {   
  //    1 BUYSTOP     
       }
      }
     }
      
}
void D_S_DELL_15(){
  {for(int icl=0;icl<=OrdersTotal();icl++){
   if(OrderSelect(icl,SELECT_BY_POS)){
   if (OrderSymbol()==Symbol()){
   if(OrderType()==OP_SELL && OrderMagicNumber()==Magic_15){
   if(OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_ASK),Slippage))icl--;} }}}}} 
void D_B_DELL_15(){
   {for(int icl=0;icl<=OrdersTotal();icl++){
   if(OrderSelect(icl,SELECT_BY_POS)){
    if (OrderSymbol()==Symbol()){   
   if(OrderType()==OP_BUY && OrderMagicNumber()==Magic_15){
   if(OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),Slippage))icl--;}}}}}}
 void D_SS_del_15(){
 for(int id=0;id<=OrdersTotal();id++)
   if(OrderSelect(id,SELECT_BY_POS,MODE_TRADES)){
   if (OrderSymbol()==Symbol()  ){
   if(OrderType()==OP_SELLSTOP && OrderMagicNumber()==Magic_15 )
   if(OrderDelete(OrderTicket()))id--;}} } 
  void D_BS_del_15(){
 for(int id=0;id<=OrdersTotal();id++)
   if(OrderSelect(id,SELECT_BY_POS,MODE_TRADES)){
   if (OrderSymbol()==Symbol()  ){
   if(OrderType()==OP_BUYSTOP && OrderMagicNumber()==Magic_15 )
   if(OrderDelete(OrderTicket()))id--;}} }
 

sergeysv

Активный участник
Твоя проблема в сигнале.
Но после первого сигнала работает как надо...
может перебор ордеров не так перебирает?
может так быть поможет?
Код:
 if (   /* Сигнал купить*/ )
 {   
 if( bs== 0 && BuyPos == 0 )
 { 
 //     1 BUYSTOP     
    }
  D_S_DELL_15();  D_SS_del_15();  // Удаляем  OP_SELL и OP_SELLSTOP
bs--////////////////?
Sleep( 10 минут);  ???
  }

        
   if( bs == 0 && BuyPos > 0) {
    if( bs == 0) {
  if(    /* Сигнал купить*/ )
  {   
  //    1 BUYSTOP     
       }
bs--  ////////////////?
Sleep( 10 минут);  ???
      }
     }
 

sergeysv

Активный участник
Делай так, чтобы сигнал на следующем баре уже не был сигналом. Тогда можно будет поставить запрет открытия на баре на котором уже есть одно открытие.
Не вариант.Это самый один может выйти из диапазона и генерировать обратный
сигнал-----а по коду запрет......
 

MrGreen86

Гуру форума
Так код работает почти как надо...
1 Сигнал = 1 Ордер
Если есть один BUYSTOP то по сигналу купить через 20 или 45 мин больше не открывает.Нужно чтоб открывал.
почти как надо = код мусор и его надо выбросить.
Вы можете нормальный код прикрепить без кастраций? Вы обрезаете именно то где у вас ошибка. В общем то это стандартно для новичков, ищут ошибку там где ее нет:

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

И вы не ответили на вопрос
/или поясните чем именно не подходит
 

AlexeNP

Гуру форума
С эти всё нормально.


Не мой уровень..:)

Так код работает почти как надо...
1 Сигнал = 1 Ордер
Если есть один BUYSTOP то по сигналу купить через 20 или 45 мин больше не открывает.Нужно чтоб открывал.
 

Вложения

  • sergeysv.mq4
    7,3 КБ · Просмотры: 15

sergeysv

Активный участник
поясните чем именно не подходит
Ну это когда мне за 40 лет и я точно знаю что у меня 43 размер обуви.
Иду на базар купить туфли/кроссы и мне предлагают 43 размер на выбор.
Я смотрю: туфли/кроссы?--да; 43 размер?--да.
Начинаю примерять ,а они еле налазят и по факту ходить в них невозможно.
Вопрос: нога выросла или мне нужен всё таки 44 или 45 ?
Ответ: при размере ноги 43 мне нужен 45 размер обуви...:)
По коду Time[0] содержит время открытия каждого бара текущего графика.
Это самый один может выйти из диапазона и генерировать обратный
сигнал который не по плану.
static datetime last_signal = 0; ---можно указать 10 минут или в 600 секундах?
if(/* Сигнал купить*/ && Time[0] > last_signal)
{
last_signal = Time[0];
// покупаем
}
Если да ,то возможно был не прав что не подходит вариант и нужно пробовать на открытии .
 

sergeysv

Активный участник
if(/* Сигнал купить*/)
{
if(bs== 0 && BuyPos == 0)
{
// 1 BUYSTOP
}
D_S_DELL_15(OP_SELL); //Закрываем OP_SELL
D_SS_del_15(OP_SELLSTOP); //Удаляем OP_SELLSTOP
}
Сигнала купить больше нет, Но сигнала продать тоже нет.
В рынке 1 BUYSTOP.
Как опять при сигнале купить открыть 1 BUYSTOP?
Спасибо:)
 

AlexeNP

Гуру форума
По коду Time[0] содержит время открытия каждого бара текущего графика.
Это самый один может выйти из диапазона и генерировать обратный
сигнал который не по плану.
static datetime last_signal = 0; ---можно указать 10 минут или в 600 секундах?
if(/* Сигнал купить*/ && Time[0] > last_signal)
{
last_signal = Time[0];
// покупаем
}
Если да ,то возможно был не прав что не подходит вариант и нужно пробовать на открытии .
Time[0] - время открытия последнего бара текущего символа по текущему таймфрейму...
если тебе нужна 10-минутная периодичность, то можно попробовать так
 

Вложения

  • sergeysv.mq4
    7,8 КБ · Просмотры: 15

AlexeyVik

Программист mql4 mql5
Но после первого сигнала работает как надо...
может перебор ордеров не так перебирает?
может так быть поможет?
Код:
 if (   /* Сигнал купить*/ )
{  
if( bs== 0 && BuyPos == 0 )
{
//     1 BUYSTOP    
    }
  D_S_DELL_15();  D_SS_del_15();  // Удаляем  OP_SELL и OP_SELLSTOP
bs--////////////////?
Sleep( 10 минут);  ???
  }

       
   if( bs == 0 && BuyPos > 0) {
    if( bs == 0) {
  if(    /* Сигнал купить*/ )
  {  
  //    1 BUYSTOP    
       }
bs--  ////////////////?
Sleep( 10 минут);  ???
      }
     }
А как ты думаешь, если в строке 3 переменные bs и BuyPos равны 0, в строке 5 ставишь ордер. Так? И что даст твой сон в течении 10 минут? Разве в это время переменная bs может изменить своё значение??? Потом ты в строке 13 и 14 проверяешь bs на равенство нулю. И что? Она так и осталась равна нулю. Хоть сутки проспи.
 

sergeysv

Активный участник
А как ты думаешь, если в строке 3 переменные bs и BuyPos равны 0, в строке 5 ставишь ордер. Так? И что даст твой сон в течении 10 минут? Разве в это время переменная bs может изменить своё значение??? Потом ты в строке 13 и 14 проверяешь bs на равенство нулю. И что? Она так и осталась равна нулю. Хоть сутки проспи.
Код:
 if (   /* Сигнал купить*/ )
{ 
if( bs== 0 && BuyPos == 0 )
{
//     1 BUYSTOP   
    }
  D_S_DELL_15();  D_SS_del_15();  // Удаляем  OP_SELL и OP_SELLSTOP
bs--   МИНУСУЕМ ИЗ ПЕРЕБОРА ОРДЕРОВ -1 BUYSTOP   
  }

Sleep( 9 минут);  ЛОЖИМ  СОВУ СПАТЬ НА 9 МИН И СИГНАЛА КУПИТЬ НЕТ  :)
В РЫНКЕ 1 BUYSTOP  НО ПО СЧЁТЧИКУ 0  
ПРОСЫПАЕМСЯ И ПРОВЕРЯЕМ: ЕСЛИ  BUYSTOP  СТАЛ БАЕМ ТО bs == 0 && BuyPos>0 
   if( bs == 0 && BuyPos > 0 && BuyPos == 0  ) { 
    if( bs == 0) {
  if(    /* Сигнал купить*/ )
  { 
  //    1 BUYSTOP   
       }
bs--  
BuyPos --
Sleep( 9 минут);  ???
      }
     }
Ну это не точно так как имеет место быть :)
 
Верх