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

 
d1w4m3:


Спасибо за ответ, но я только как пару недель начал учиться, как это в коде реализовать, или подскажите где почитать пожалуйста. Или по Игорю Киму сделать?

И все же он будет открывать позицию, не по системе, когда только начинает свою работу, Ваше условие не избегает этой проблемы. 

А если подумать? Почему это не избегает проблемы?

Когда он начинает работу, и если до этого не работал (вообще первый запуск), то не было ещё его позиций, и логика покажет, что последней закрытой позиции попросту ещё нету. Это означает, что она не могла быть закрыта ни по стопу, ни по тейку, что в свою очередь даёт разрешение на открытие позиции по сигналу.

Нет разве?

 
Artyom Trishkin:

А если подумать? Почему это не избегает проблемы?

Когда он начинает работу, и если до этого не работал (вообще первый запуск), то не было ещё его позиций, и логика покажет, что последней закрытой позиции попросту ещё нету. Это означает, что она не могла быть закрыта ни по стопу, ни по тейку, что в свою очередь даёт разрешение на открытие позиции по сигналу.

Нет разве?


В том то и дело что по сигналу! Вот только условие может удовлетворять  не на 2 баре(как только индикатор поменял буфер), а на любом втором баре(потом все работает по системе конечно). Проблема как раз в условии открытия ордеров, как привязать его, только ко 2 бару после изменения буфера индикатора?  

void OnTick()

{
  uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 0, n), 4);
  dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 1, n), 4); 
  
if(DN_Trend()==true)
{
  if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
  { 
   ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
      if (ticket > 0)
      {
         SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
         TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
         
         if (OrderSelect(ticket, SELECT_BY_TICKET))
         if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
           Print("Ошибка на продажу");
      }

  }


 
d1w4m3:


В том то и дело что по сигналу! Вот только условие может удовлетворять  не на 2 баре(как только индикатор поменял буфер), а на любом втором баре(потом все работает по системе конечно). Проблема как раз в условии открытия ордеров, как привязать его, только ко 2 бару после изменения буфера индикатора?  

void OnTick()

{
  uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 0, n), 4);
  dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 1, n), 4); 
  
if(DN_Trend()==true)
{
  if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
  { 
   ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
      if (ticket > 0)
      {
         SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
         TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
         
         if (OrderSelect(ticket, SELECT_BY_TICKET))
         if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
           Print("Ошибка на продажу");
      }

  }


Вставляйте код правильно. Есть кнопка SRC в меню редактора сообщения.
Из ваших объяснений я ничего не понял.
 
d1w4m3:


В том то и дело что по сигналу! Вот только условие может удовлетворять  не на 2 баре(как только индикатор поменял буфер), а на любом втором баре(потом все работает по системе конечно). Проблема как раз в условии открытия ордеров, как привязать его, только ко 2 бару после изменения буфера индикатора?  

void OnTick()
{
  uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 0, n), 4);
  dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 1, n), 4); 
  
if(DN_Trend()==true)
{
  if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
  { 
   ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
      if (ticket > 0)
      {
         SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
         TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
         
         if (OrderSelect(ticket, SELECT_BY_TICKET))
         if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
           Print("Ошибка на продажу");
      }

  }


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

2. Тонкий намёк: А где Open[4] и Close[4] относительно значений индикатора?

 
extern int TakeProfit  = 200;
extern double Lots     = 0.1;
extern int StopLoss    = 52;
extern int Magic       = 1111;
extern int Slippage    = 3;
extern int n           = 3; // На какую свечу открывать ордер
//------------------------------------------------------------------
extern int  LevelWLoss  = 1;      // Уровень безубытка
extern int  LevelProfit = 30;     // Уровень профита
//------------------------------------------------------------------
extern string    Slope  = "Параметры Slope";
extern int       period = 163; 
extern int       method = 3;                         
extern int       price  = 0;    
//------------------------------------------------------------------
double uptr, SL, TP, dntr;
int    ticket, nd;
bool   fm;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   if (Digits == 3 || Digits == 5)
   {
       TakeProfit  *=10;
       StopLoss    *=10;
       Slippage    *=10;
       LevelWLoss  *=10;
       LevelProfit *=10;
   }
   return(0);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 0, n), 4);
  dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 1, n), 4); 
  
if(DN_Trend()==true)
{
  if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
  { 
   ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
      if (ticket > 0)
      {
         SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
         TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
         
         if (OrderSelect(ticket, SELECT_BY_TICKET))
         if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
           Print("Ошибка на продажу");
      }
  }
}//if(DN_Trend()==true)

if(UP_Trend()==true)
{
   if( CountBuy() == 0  && Ask > uptr && Open[3] > uptr && Close[3] > uptr  )
  {
   ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "Sloper", Magic, 0, Blue);
      if (ticket>0)
      {
         TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
         SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
         
         if (OrderSelect(ticket, SELECT_BY_TICKET))
            if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
               Print("Ошибка на покупку");
       }
    }
}//if(UP_Trend()==true)

      if ( CountSell()>0  && Open[3] > uptr && Close[3] > uptr && UP_Trend()==true)
      {
      for(int i = OrdersTotal() -1; i>=0; i--)
          {
            if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
            if (OrderMagicNumber() == Magic && OrderType() == OP_SELL)
            if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black))
            Print("Ошибка");
            }
          }
      }
      if ( CountBuy()>0 && Open[3] < dntr && Close[3] < dntr && DN_Trend()==true)
      {
      for(int i = OrdersTotal() -1; i>=0; i--)
          {
            if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
            if (OrderMagicNumber() == Magic && OrderType() == OP_BUY)
            if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black))
            Print("Ошибка");
            }
          }
      }
      //+переход в безубыток+
   for( int i=0; i<OrdersTotal(); i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
        if(OrderSymbol()== Symbol() && OrderMagicNumber()==Magic)
          {
            if(OrderType()==OP_BUY) 
              {
                if(OrderStopLoss()-OrderOpenPrice()<LevelWLoss*Point) 
                 {
                   if(Bid-OrderOpenPrice()>LevelProfit*Point) 
                 {
                  fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+LevelWLoss*Point,OrderTakeProfit(),CLR_NONE);
                 }
              }
            }
           }
         if(OrderType()==OP_SELL) 
           {
            if(OrderStopLoss()==0 || OrderOpenPrice()-OrderStopLoss()<LevelWLoss*Point) 
              {
               if(OrderOpenPrice()-Ask>LevelProfit*Point) 
                 {
                  fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-LevelWLoss*Point,OrderTakeProfit(),CLR_NONE);
                 }
              }
           }
       
        }
     }
     
//------------  комментарии -----------------+     
  if(UP_Trend()) Comment("Восходящий тренд ", uptr);
  if(DN_Trend()) Comment("Нисходящий тренд ", dntr);
 
 }
//+------------------------------------------------------------------+
int CountSell()
{
   int count = 0;
   for (int trade = OrdersTotal()-1; trade>=0; trade--)
   {
        if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
    {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
                    count++;   
    }
   }
     return(count);
}
//+------------------------------------------------------------------+
int CountBuy()
{
   int count = 0;
   for (int trade = OrdersTotal()-1; trade>=0; trade--)
   {
        if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
    {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
                    count++;   
    }
   }
     return(count);
}
//+------------------------------------------------------------------+
bool UP_Trend()
{
  if(uptr > 0 && uptr != 2147483647.0) return(true);
  return(false);
}
//+------------------------------------------------------------------+
bool DN_Trend()
{
  if(dntr > 0 && dntr != 2147483647.0) return(true);
  return(false);
}
//+------------------------------------------------------------------+
 

Если мы вставим Ваше условие " Это означает, что она не могла быть закрыта ни по стопу, ни по тейку, что в свою очередь даёт разрешение на открытие позиции по сигналу."

А сигнал у меня "if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)"  (вместе со сдвигом в индикаторе n=3),

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

 
d1w4m3:

Если мы вставим Ваше условие " Это означает, что она не могла быть закрыта ни по стопу, ни по тейку, что в свою очередь даёт разрешение на открытие позиции по сигналу."

А сигнал у меня "if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)"  (вместе со сдвигом в индикаторе n=3),

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

Я ничего не понял. Что у вас не получается? Вы не можете определить что последняя позиция была закрыта по стопу или тейку? Вы не можете найти место в своём коде куда вписать проверку на это условие?

Или что вы не можете сделать?

Как он может открыть в момент запуска сразу на третьей свече? Или поясните что означает "он откроет с момента запуска на третью свечу"? Это вообще что означает?
 

при каждом открытии ордера по какому-то сигналу индикатора, как запомнить тип этого сигнала в переменную?

остается баг(при запуске советника) ордер открывается не в начале тренда(не по изменению цвета индикатора), т.к. в моем условии нет привязке к конкретным свечам, а говорится, если тренд ап или даун откроет на начало 3 свечи


 

Всем доброго дня. 

Задался таким вопросом как анализировать статистику работы в EXCEl

Кто подскажет, что можно вытянуть через DDE из mt4  и где можно взять все допустимые функции для переноса в excel

Буду благодарен за помощь

 
Maxim Shershnev:

Всем доброго дня. 

Задался таким вопросом как анализировать статистику работы в EXCEl

Кто подскажет, что можно вытянуть через DDE из mt4  и где можно взять все допустимые функции для переноса в excel

Буду благодарен за помощь

Tут есть всё что надо. Формат записи .csv пишет в excell
Файловые операции - Справочник MQL4
Файловые операции - Справочник MQL4
  • docs.mql4.com
Файловые операции - Справочник MQL4