Советники: Expert Ichimoku - страница 2

 
Vladimir Karputov #:

Включите отладку кода и тестируйте шаг за шагом.

Спасибо за ваш ответ.

Я выполнил отладку и обнаружил, что причиной этой проблемы является неправильный SL из-за высокого спреда.

 
amin ghanbari # :

Спасибо за ваш ответ.

Я провел отладку и обнаружил, что причиной этой проблемы является неправильный SL из-за высокого спреда.

Код внутри эксперта правильный - но если в момент выставления цена совершает сильное движение, то ПОЗИЦИЯ не будет открыта.

 
Vladimir Karputov #:

Код внутри советника правильный - но если в момент размещения цена совершает сильное движение, то ПОЗИЦИЯ не будет открыта.

Я думаю, что этот раздел должен быть изменен для crypo:


//--- настройка на 3 или 5 цифр
   int digits_adjust=1;
   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
      digits_adjust=10;
   m_adjusted_point=m_symbol.Point()*digits_adjust;

   ExtStopLoss    = InpStopLoss     * m_adjusted_point;
   ExtTakeProfit  = InpTakeProfit   * m_adjusted_point;
   ExtTrailingStop= InpTrailingStop * m_adjusted_point;
   ExtTrailingStep= InpTrailingStep * m_adjusted_point;


Когда я использую RISK для определения лота, я вижу ошибку getpointer, и мне приходится использовать fix LOT:

//+------------------------------------------------------------------+
//| Лоты или риск в процентах для сделки со свободной маржой |
//+------------------------------------------------------------------+
bool LotsOrRisk(const double lots,const double risk,const int digits_adjust)
  {
   if(lots<0.0 && risk<0.0)
     {
      Print(__FUNCTION__,", ERROR: Parameter (\"lots\" or \"risk\") can't be less than zero");
      return(false);
     }
   if(lots==0.0 && risk==0.0)
     {
      Print(__FUNCTION__,", ERROR: Trade is impossible: You have set \"lots\" == 0.0 and \"risk\" == 0.0");
      return(false);
     }
   if(lots>0.0 && risk>0.0)
     {
      Print(__FUNCTION__,", ERROR: Trade is impossible: You have set \"lots\" > 0.0 and \"risk\" > 0.0");
      return(false);
     }
   if(lots>0.0)
     {
      string err_text="";
      if(!CheckVolumeValue(lots,err_text))
        {
         Print(__FUNCTION__,", ERROR: ",err_text);
         return(false);
        }
     }
   else
      if(risk>0.0)
        {
         if(m_money!=NULL)
            delete m_money;
         m_money=new CMoneyFixedMargin;
         if(m_money!=NULL)
           {
            if(!m_money.Init(GetPointer(m_symbol),Period(),m_symbol.Point()*digits_adjust))
               return(false);
            m_money.Percent(risk);
           }
         else
           {
            Print(__FUNCTION__,", ERROR: Object CMoneyFixedMargin is NULL");
            return(false);
           }
        }
//---
   return(true);
  }
//+------------------------------------------------------------------+
 
amin ghanbari # :

***

Когда я использую RISK для определения лота, я вижу ошибку getpointer, и мне приходится использовать fix LOT:

Вы видите свою ошибку - подумайте: какое значение риска вы устанавливаете?

 

Примечание: если вы используете инструменты с огромным спредом, вы должны установить соответствующий Stop Loss.

Всегда помните - существует ДВЕ цены: Ask и Bid.

 
Vladimir Karputov #:

Увидели свою ошибку - подумайте: какую величину риска вы устанавливаете?

Спасибо за ответ. в эксперте все правильно. проблемы из-за недостаточного баланса инеправильного SL из-за огромного спреда.

Я установил 1% риск для баланса 500$. кредитное плечо установлено на 100. появляются такие ошибки:

OpenBuy, ERROR: метод CheckOpenLong

OpenSell, ERROR: метод CheckOpenShort

это значит, что этого баланса не достаточно для открытия позиции с минимальным размером лота в BTC?

правда ли это?

 
amin ghanbari # :

Спасибо за ответ. В эксперте все правильно. Проблемы возникают из-за недостаточного баланса и неправильного SL из-за разброса объятий.

Я установил 1% риск для баланса 500$. кредитное плечо установлено на 100. появляются эти ошибки:

OpenBuy, ERROR: метод CheckOpenLong

OpenSell, ERROR: метод CheckOpenShort

это значит, что данного баланса недостаточно для открытия позиции с минимальным размером лота в BTC?

правда ли это?

Вы нашли свою ошибку. Теперь подумайте, как вы можете исправить свою ошибку.

 

Здравствуйте, Владимир

Спасибо, что поделились экспертом, я пытаюсь добавить условие для закрытия позиции, когда закрытие бара проходит облако, вот код, который я добавил, не могли бы вы мне помочь, пожалуйста, я очень новичок в mql5


 
Mahmoud Ahmed Mahmoud Fahmy # :

Здравствуйте, Владимир

Спасибо, что поделились экспертом, я пытаюсь добавить условие для закрытия позиции, когда закрытие бара проходит облако, вот код, который я добавил, не могли бы вы мне помочь, пожалуйста, я очень новичок в mql5


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

 
Vladimir Karputov #:

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

Здравствуйте, еще раз

Спасибо большое за ответ, и я очень сожалею о беспорядке, который я сделал, я изменил код немного из моего последнего сообщения, и он по-прежнему не закрывает позицию, и я установил stoploss = 0

   double Kij2=iIchimokuGet(KIJUNSEN_LINE,3);
   double SpanA2=iIchimokuGet(SENKOUSPANA_LINE,3);
   double SpanB2=iIchimokuGet(SENKOUSPANB_LINE,3);
   double Chinkou2=iIchimokuGet(CHIKOUSPAN_LINE,3);
   
   
   //закрытие ордеров
   
  
   
   
  // m_trade.PositionClose(m_symbol.Name());
   // купить заказы
  // {
      
     // if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY )
     // {
        // if(iClose(_Symbol,Period(),1) < SpanB)
       // {
            //m_trade.PositionClose(_Symbol);
          // }
            
     // } 
     // }
      
      //SELL ORDERS
      
     // if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
     // {
         
       // if(iClose(_Symbol,Period(),1) > SpanB)
        // {
         // m_trade.PositionClose(_Symbol);
         //}
      // }
            
          // if(m_trade.ResultRetcode()==10008 || m_trade.ResultRetcode()==10009) //Запрос выполнен или заказ размещен
             // {
             // Print("Правила выхода: Ордер на закрытие был успешно размещен с тикетом#: ",m_trade.ResultOrder());
             // }
            //else
              // {
              // Print("Правила выхода: Запрос на закрытие ордера не может быть выполнен.Ошибка: ",GetLastError());
             // ResetLastError();
               //return;
              // }
            
        // }
    // }
  // }
   
   
//--- проверить ПОКУПАТЬ
      if (iClose(_Symbol,PERIOD_D1,1) < iClose(_Symbol,PERIOD_D1,2) && iHigh(_Symbol,PERIOD_H4,2) - iLow(_Symbol,PERIOD_H4,2) > iHigh(_Symbol,PERIOD_H4,1)- iLow(_Symbol,PERIOD_H4,2) )
      {  

      if (iOpen(m_symbol.Name(),Period(),0) > Kij && iOpen(m_symbol.Name(),Period(),0) > SpanA)
  // if(Ten1<=Kij1 && Ten>Kij &&
   //&& m_symbol.Ask()>SpanA1 
   //&& m_symbol.Ask()>SpanB1 && 
     // iOpen(m_symbol.Name(),Period(),1)<iClose(m_symbol.Name(),Period(),1)) //|| 
      //(Chinkou1<=iClose(m_symbol.Name(),Period(),11) && Chinkou>iClose(m_symbol.Name(),Period(),10) && 
     // m_symbol.Ask()>SpanA1 && m_symbol.Ask()>SpanB1 && 
     // iOpen(m_symbol.Name(),Period(),1)<iClose(m_symbol.Name(),Period(),1))
     {
      double sl=(InpStopLoss==0)?0.0:m_symbol.Ask()-ExtStopLoss;
      if(sl>=m_symbol.Bid()) // инцидент: позиция еще не открыта и должна быть уже закрыта
        {
         PrevBars=0;
         return;
        }
      double tp=(InpTakeProfit==0)?0.0:m_symbol.Ask()+ExtTakeProfit;
           if(iClose(_Symbol,Period(),1) < SpanB)
   {
      if(m_position.Select(_Symbol))                     //если позиция для этого символа уже существует
        {
         if(m_position.PositionType()==POSITION_TYPE_BUY) m_trade.PositionClose(_Symbol);   //если это позиция на покупку, то закройте ее
        // if(m_Position.PositionType()==POSITION_TYPE_SELL) return;
         }
   }
      
      OpenBuy(sl,tp);
     }
     }
     
//--- проверить ПРОДАВАТЬ
         
     if (iClose(_Symbol,PERIOD_D1,1) > iClose(_Symbol,PERIOD_D1,2) && iHigh(_Symbol,PERIOD_D1,2) - iLow(_Symbol,PERIOD_H4,2) > iHigh(_Symbol,PERIOD_H4,1)- iLow(_Symbol,PERIOD_H4,2) )
      {
 
      if(iOpen(m_symbol.Name(),Period(),0) < Kij && iOpen(m_symbol.Name(),Period(),0) < SpanB)
        
         
        
  // if(Ten1>Kij1 && Ten<Kij &&
   //&& m_symbol.Bid()<SpanA1 && m_symbol.Bid()<SpanB1 && 
     // iOpen(m_symbol.Name(),Period(),1)>iClose(m_symbol.Name(),Period(),1)) //|| 
      //(Chinkou1>=iOpen(m_symbol.Name(),Period(),11) && Chinkou<iOpen(m_symbol.Name(),Period(),10) && 
      //m_symbol.Bid()<SpanA1 && m_symbol.Bid()<SpanB1 && 
      //iOpen(m_symbol.Name(),Period(),1)>iClose(m_symbol.Name(),Period(),1)))
     {
      double sl=(InpStopLoss==0)?0.0:m_symbol.Bid()+ExtStopLoss;
      if(sl<=m_symbol.Ask()) // инцидент: позиция еще не открыта и должна быть уже закрыта
        {
         PrevBars=0;
         return;
        }
      double tp=(InpTakeProfit==0)?0.0:m_symbol.Bid()-ExtTakeProfit;
      
         if(iClose(_Symbol,Period(),1) > SpanB)
         {
            if(m_position.Select(_Symbol))                     //если позиция для этого символа уже существует
            {
               if(m_position.PositionType()==POSITION_TYPE_SELL) m_trade.PositionClose(_Symbol);   //если это позиция на покупку, то закройте ее
        // if(m_Position.PositionType()==POSITION_TYPE_SELL) return;
            }
         }
      
      OpenSell(sl,tp);
     }
    } 
    // m_trade.PositionClose(_Symbol);
  }