오류, 버그, 질문 - 페이지 52

 
하지만 MT4에서는 그렇지 않았습니다. 감사합니다. 그냥 내려놓았다
 

Expert Advisors를 테스트할 때:
Exp_TEMA.mq5, "Creating Expert Advisor that trades on different instrument" , Told[] Tnew[1] 표현식은 다음 값을 얻습니다.
Told[] 표현식을 평가할 수 없습니다.
Tnew[1] 잘못된 배열 범위입니다.

및 My_First_EA.mq5, "초보자를 위한 MQL5 Expert Advisors 작성에 대한 단계별 가이드" 기사, 표현식
New_Time[1] 값을 가져옵니다: 잘못된 배열 범위

표현식의 값을 평가할 수 없으며 유효하지 않은 배열 범위는 무엇을 의미하며 Expert Advisors의 결과에 어떤 영향을 줍니까?

 

Told - 크기가 없는 빈 배열

Tnew[1] - 배열을 넘어 배열은 Tnew[1]로 설명되므로 인덱스가 0부터 시작하므로 해당 요소는 Tnew[0]으로만 액세스할 수 있습니다.

[삭제]  
Renat :

Told - 크기가 없는 빈 배열

Tnew[1] - 배열을 넘어 배열이 Tnew[1]로 설명되므로 인덱스가 0에서 시작하기 때문에 해당 요소는 Tnew[0]으로만 액세스할 수 있습니다.


나는 이미 포럼의 다른 스레드에서 Tnew에 대해 이야기했으며 분명히 개발자의 의견이 필요했습니다. :)
 

조건별로 하나의 거래만 여는 방법을 알려주세요. 내 코드를 사용하여 터미널은 이 조건에 대해 여러 거래를 시작하지만 하나만 필요합니다.

       if (Buy_Signal)
        {
         mrequest.price = NormalizeDouble (latest_price.ask, _Digits );           // последняя цена ask
         mrequest.sl = NormalizeDouble (latest_price.ask - STP* _Point , _Digits ); // Stop Loss
         mrequest.tp = NormalizeDouble (latest_price.ask + TKP* _Point , _Digits ); // Take Profit
         mrequest.type = ORDER_TYPE_BUY ;                                       // ордер на покупку
         //--- отсылаем ордер
         OrderSend (mrequest,mresult);        
        }        

       if (Sell_Signal)
        {
         mrequest.price = NormalizeDouble (latest_price.bid, _Digits );           // последняя цена Bid
         mrequest.sl = NormalizeDouble (latest_price.bid + STP* _Point , _Digits ); // Stop Loss
         mrequest.tp = NormalizeDouble (latest_price.bid - TKP* _Point , _Digits ); // Take Profit
         mrequest.type= ORDER_TYPE_SELL ;                                       // ордер на продажу                                          
         //--- отсылаем ордер
         OrderSend (mrequest,mresult);              
        }
      

결과는 다음 그림입니다.

이러한 조건으로 거래가 이루어졌는지 확인하는 방법은 무엇입니까? 작동하지 않습니다.

 // в этом цикле поочередно перебираем все открытые позиции 
   for (i= 0 ;i< PositionsTotal ();i++)
     {
       // выбираем позиции только по "нашему" инструменту
       if ( Symbol ()== PositionGetSymbol (i))
     ...
     }
[삭제]  
AM2 :

조건별로 하나의 거래만 여는 방법을 알려주세요. 내 코드를 사용하여 터미널은 이 조건에 대해 여러 거래를 시작하지만 하나만 필요합니다.

결과는 다음 그림입니다.

이러한 조건으로 거래가 이루어졌는지 확인하는 방법은 무엇입니까? 작동하지 않습니다.

그리고 PositionSelect 와 같은 멋진 작은 것이 있는 경우 검색을 주기로 정렬하려면 어떻게 해야 합니까?

관심 있는 악기의 위치만 체크하고, true가 반환되면 조용히 코냑을 마시고 시가를 피울 수 있습니다... :)

추신

그러나 내가 이해하는 바와 같이 PositionSelect 가 없는 PositionGetString 은 작동하지 않아야 합니다. 모든 열린 자세의 기호를 알 필요는 없겠죠?

 
Interesting :

그리고 PositionSelect 와 같은 멋진 작은 것이 있는 경우 검색을 주기로 정렬하려면 어떻게 해야 합니까?

관심 있는 악기의 위치만 체크하고, true가 반환되면 조용히 코냑을 마시고 시가를 피울 수 있습니다... :)

추신

그러나 내가 이해하는 바와 같이 PositionSelect 가 없는 PositionGetString 은 작동하지 않아야 합니다. 모든 열린 자세의 기호를 알 필요는 없겠죠?

이 코드는 오픈 포지션의 존재를 고려합니다:

   if (Buy_Signal && PositionSelect ( Symbol ())==false)
     {
         mrequest.type = ORDER_TYPE_BUY ;                                       // ордер на покупку
         mrequest.price = NormalizeDouble (latest_price.ask, _Digits );           // последняя цена ask
         mrequest.sl = NormalizeDouble (latest_price.ask - STP* _Point , _Digits ); // Stop Loss
         mrequest.tp = NormalizeDouble (latest_price.ask + TKP* _Point , _Digits ); // Take Profit
         OrderSend (mrequest,mresult);                                           // отсылаем ордер                
     }

그러나 Buy_Signal 조건이 충족되는 한 계속해서 포지션을 엽니다. Sell_Signal 조건이 발생하기 전에 Buy_Signal 포지션 개설을 중단해야 합니다. 다음과 같이 구현하려고 합니다.

   Buy_Signal = true;
   Sell_Signal = true;                

   if (Buy_Signal && PositionSelect ( Symbol ())==false)
     {
         mrequest.type = ORDER_TYPE_BUY ;                                       // ордер на покупку
         mrequest.price = NormalizeDouble (latest_price.ask, _Digits );           // последняя цена ask
         mrequest.sl = NormalizeDouble (latest_price.ask - STP* _Point , _Digits ); // Stop Loss
         mrequest.tp = NormalizeDouble (latest_price.ask + TKP* _Point , _Digits ); // Take Profit
         OrderSend (mrequest,mresult);                                           // отсылаем ордер
         Buy_Signal = false;
         Sell_Signal = true;                
     }


   if (Sell_Signal && PositionSelect ( Symbol ())==false)
     {
         mrequest.type= ORDER_TYPE_SELL ;                                       // ордер на продажу
         mrequest.price = NormalizeDouble (latest_price.bid, _Digits );           // последняя цена Bid
         mrequest.sl = NormalizeDouble (latest_price.bid + STP* _Point , _Digits ); // Stop Loss
         mrequest.tp = NormalizeDouble (latest_price.bid - TKP* _Point , _Digits ); // Take Profit
         OrderSend (mrequest,mresult);                                           // отсылаем ордер    
         Buy_Signal = true;
         Sell_Signal = false;                
     }
가지 않는다.
[삭제]  
AM2 :

이 코드는 오픈 포지션의 존재를 고려합니다:

그러나 Buy_Signal 조건이 충족되는 한 계속해서 포지션을 엽니다. Sell_Signal 조건이 발생하기 전에 Buy_Signal 포지션 개설을 중단해야 합니다. 다음과 같이 구현하려고 합니다.

가지 않는다.

왜 정확히 이 코드를 사용합니까? 크게 늘여도 내가 소개한 것과 닮지 않았습니다(일반적으로 모든 것이 맞는지 의심스럽습니다)

   if (Buy_Signal && PositionSelect ( Symbol ())==false)
     {
         mrequest.type = ORDER_TYPE_BUY ;                                     // ордер на покупку
         mrequest.price = NormalizeDouble (latest_price.ask, _Digits );          // последняя цена ask
         mrequest.sl = NormalizeDouble (latest_price.ask - STP* _Point , _Digits ); // Stop Loss
         mrequest.tp = NormalizeDouble (latest_price.ask + TKP* _Point , _Digits ); // Take Profit 
         OrderSend (mrequest,mresult);                                        // отсылаем ордер                
     }

그리고 다음과 같이 입력해야 했습니다.

Ask = SymbolInfoDouble ( _Symbol , SYMBOL_ASK );

SL = NormalizeDouble (Ask - 500 * _Point , _Digits );   // Stop Loss
TP = NormalizeDouble (Ask + 1500 * _Point , _Digits ); // Take Profit

   if (Buy_Signal)
   //Получен сигнал на market buy
  {
  
     if (! PositionSelect ( _Symbol ))
     //Позиции по данному символу отсутствуют
    {
    mrequest.action = TRADE_ACTION_DEAL ; //Установка рыночного ордера (позиция)
    mrequest.type   = ORDER_TYPE_BUY ;     //Ордер на покупку
    mrequest.magic = 18072010 ;          //ORDER_MAGIC
    mrequest.symbol = _Symbol ;          //Инструмент
    mrequest.volume = 0.1 ;              //Объем в 0.1 лот
    mrequest.price = Ask;   //Цена открытия
    mrequest.sl = SL;       //Stop Loss
    mrequest.tp = TP;       //Take Profit
    mrequest.deviation = 5 ; //Отклонение в 5 пунктов   
     OrderSend (mrequest,mresult); //Отсылаем ордер
    }
  
  }

최악의 경우 모든 것이 블록으로 정리될 수 있습니다.

   if ((Buy_Signal)&&(! PositionSelect ( _Symbol )))
   //Получен сигнал market buy
  {
  ...........................................  
  }
 
Interesting :

왜 정확히 이 코드를 사용합니까? 크게 늘여도 내가 소개한 것과 닮지 않았습니다(일반적으로 모든 것이 맞는지 의심스럽습니다)

그리고 다음과 같이 입력해야 했습니다.

최악의 경우 모든 것이 블록으로 정리될 수 있습니다.

 if ((Buy_Signal)&&(! PositionSelect ( _Symbol )))
   //Получен сигнал market buy
  {
  ...........................................  
  }

이 코드 이상은 닫힐 때까지 위치 를 열지 않지만 조건이 충족되면 다음 막대에서 닫은 후 다시 열립니다. 나는 이것을 다음과 같이 구현했다.

 bool BuyOne = true, SellOne = true; // только один ордер.  глобальные переменные




   if (Buy_Signal &&                                                         // покупаем если есть сигнал на покупку
       PositionSelect ( Symbol ())==false &&                                     // ордер закрыт
      BuyOne)                                                               // при условии на покупку ставим только один ордер
     {
      mrequest.type = ORDER_TYPE_BUY ;                                       // ордер на покупку
      mrequest.price = NormalizeDouble (latest_price.ask, _Digits );           // последняя цена ask
      mrequest.sl = NormalizeDouble (latest_price.ask - STP* _Point , _Digits ); // Stop Loss
      mrequest.tp = NormalizeDouble (latest_price.ask + TKP* _Point , _Digits ); // Take Profit
       OrderSend (mrequest,mresult);                                           // отсылаем ордер
      BuyOne = false;                                                       // на покупку только один ордер                                                  
      SellOne = true;                                                       // меняем флаг одного ордера на продажу          
     }

고맙습니다! 그는 모든 소원을 고려했습니다. 이제 모든 것이 작동합니다. 고문이 게시를 위해 게시했습니다. 코드를 변경할 수도 있습니다. 유혹에는 제한이 없습니다)))

 
설명서에서 MqlTradeCheckResult 검사 결과 구조에 대한 응답 코드(Retcode)에 대한 설명을 찾지 못했습니다. 그들은 할 것인가?
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса - Документация по MQL5