Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 99

 

Дратути. Как делать подобную панель?  

 
Andrey Sokolov:

Дратути. Как делать подобную панель?  

Возьмите в кодобазе пример, и по нему переделайте, там много советников с панелями на любой вкус. Начинается всё с фона
 
Andrey Sokolov:

Дратути. Как делать подобную панель?  

Графическими объектами.
 
 
Andrey Sokolov:
Vitaly MuzichenkoArtyom Trishkin спасиб.
Нзчт
 
trader781:

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

В текущий момент есть желаемый  параметр который должен отвечать за возможность открытия следующего ордера после того как закроется предыдущий(е)

нужно сделать 2 сценария

1) если значение истинно

открываем ордер

обрабатываем

закрываем

и по новой

2)  если ложно 

Открываем ордер

Обрабатываем

Закрываем 

и весело выполняем ExpertRemove

вся проблема в том что эти два условия взаимоисключающие, но нужно совместить в 1 эксперте так как

1) на старте задается значение

2) в условиях входа и обработки оно принимается к обработке как (если истина то открываем)

3) после закрытия ставим ложное

Если кому такое интересно буду рад выслушать варианты.
С логикой беда.

Всё просто же:

  1. открываем ордер
  2. обрабатываем ордер
  3. закрываем ордер
  4. проверяем условие и...
    • если истинно, то ExpertRemove()
  5. и по-новой
 
Artyom Trishkin:
С логикой беда.

Всё просто же:

  1. открываем ордер
  2. обрабатываем ордер
  3. закрываем ордер
  4. проверяем условие и...
    • если истинно, то ExpertRemove()
  5. и по-новой
Вроде что-то не то, если истинно - нужно капусту рубить, а не в кусты)
 
Vitaly Muzichenko:
Вроде что-то не то, если истинно - нужно капусту рубить, а не в кусты)
Ну ошибся. Ложно. Я ж не знаю чего там проверяется... Блин, логика-то осталась.
Или вам просто поболтать?
 

Подскажите пожалуйста. Эксперт не открывает ордера в терминале. Компиляция проходит, по графикам ордера должны открываться. По факту их нет. Код прилагаю.

double Lots=NormalizeDouble((AccountFreeMargin()/100*Percent)/MarketInfo(Symbol(),MODE_MARGINREQUIRED),1);//Определение количества лотов
double MacdCurrent=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,0);//Параметры MACD основной линии текущего бара
double MacdPrevious1=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,1);//Параметры MACD основной линии предыдущего бара
double MacdPrevious2=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,2);//Параметры MACD основной линии со смещением на 2 бара
double StopLoss=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,0);//Параметры Трейлинг стоп по параметрам ParabolicSAR текущего бара
double Previous_StopLoss=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,1);//Параметры СтопЛосс по параметрам ParabolicSAR предыдущего бара
double PSARCurrent=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,0);//Параметры ParabolicSAR текущего бара
double PSARPrevious=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,1);//Параметры ParabolicSAR предыдущего бара
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   static datetime New_Time=TimeCurrent();// Время текущего бара
   bool New_Bar=false;                    // Флаг нового бара
   int ticket,total,cnt;
//---------------------------------------------------------------------------
     {
      New_Bar=false;        // Нового бара нет
      if(Time[0]==New_Time) // Сравниваем время
        {
         New_Bar=true;      // Поймался новый бар
         if(New_Bar==false)    // Если бар не новый..
            return;            // ..то уходим  
        }
     }
   total=OrdersTotal();// Опредление количства ордеров
   if(total<1)
     {
      //--- нет открытых ордеров
      if((AccountFreeMargin()/100*Percent)<MarketInfo(Symbol(),MODE_MARGINREQUIRED)*(MarketInfo(Symbol(),MODE_MINLOT)))
         //Проверка на наличие денежных средств для открытия минимального лота
        {
         Print("Недостаточно средств. Свободные средства = ",AccountFreeMargin());
         return;
        }

      //--- условие для открытия длинной позиции (BUY)
      if((MacdCurrent>0 && MacdPrevious1<=0 && MacdPrevious2<0)
         &&
         PSARCurrent<iOpen(NULL,0,1))
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StopLoss,0,NULL,MAGICNUMBER,0,Green);
         if(ticket>0)//проверка отрытия позиции
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               Print("BUY ордер открыт : ",OrderOpenPrice());
            else
               Print("Ошибка открытия BUY ордера : ",GetLastError());
            return;
           }
        }

      //--- условие для открытия короткой позиции (SELL)
      if((MacdCurrent<0 && MacdPrevious1>=0 && MacdPrevious2>0)
         &&
         PSARCurrent>iOpen(NULL,0,1))
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,StopLoss,0,NULL,MAGICNUMBER,0,Red);
         if(ticket>0)//проверка открытия позиции
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               Print("SELL ордер открыт : ",OrderOpenPrice());
            else
               Print("Ошибка открытия SELL ордера : ",GetLastError());
            return;
           }
        }
      //--- выход из блока "нет открытых ордеров"

     }
//--- важно правильно войти в рынок, но более важно правильно из него выйти  
   for(cnt=0;cnt<total;cnt++)
     {
      if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MAGICNUMBER && // проверка магического номера ордера
            OrderSymbol()==Symbol()) // проверка символа ордера
           {
            //--- длинная позиция открыта
            if(OrderType()==OP_BUY)
              {
               //--- должен быть закрыт?
               if((MacdCurrent<0 && MacdPrevious1>=0 && MacdPrevious2>0)
                  &&
                  PSARCurrent>iOpen(NULL,0,1))
                 {
                  //--- закрытие ордера и выход
                  if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))
                     Print("Ошибка закрытия ордера ",GetLastError());
                  return;
                 }
               //------------------Модификация ордера по СтопЛоссу
               if(StopLoss>Previous_StopLoss && StopLoss<iOpen(NULL,0,0))
                  if(!OrderModify(OrderTicket(),OrderOpenPrice(),Previous_StopLoss,0,0,Blue))
                     Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
               else
                  Print("Цена Stop Loss ордера успешно модифицирована.");
               return;
              }
           }

      else // идём на короткую позицию
      if(OrderType()==OP_SELL)
        {
         //--- должен быть закрыт?
         if((MacdCurrent>0 && MacdPrevious1<=0 && MacdPrevious2<0)
            &&
            PSARCurrent<iOpen(NULL,0,1))
           {
            //--- закрытие ордера и выход
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
               Print("Ошибка закрытия ордера ",GetLastError());
            return;
           }
         //-----------------Модификация ордера по СтопЛоссу            
         if(StopLoss<Previous_StopLoss && StopLoss>iOpen(NULL,0,0))
            if(!OrderModify(OrderTicket(),OrderOpenPrice(),Previous_StopLoss,0,0,Blue))
               Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
         else
            Print("Цена Stop Loss ордера успешно модифицирована.");
         return;
        }
     }
  }

//-------------------------------------------------------------------------------------------------------

 
trader781:

да, впринципе все проще

а что если оставить этот вариант как запасной и сделать вот так

проверяем условие и...
  • если истинно, то бот висит с минимальной активностью, желательно вообще без таковой

 т.е как тогда заблокировать вход для дальнейшей работы

return(0); но так не желательно - он не будет больше ничего обрабатывать.