초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 305

 
PokrovMT5 :

모두 좋은 저녁! 나는 테스터에서 미결 거래에 대한 흔적을 남기는 것을 생각하고 OrderGet....() 을 통해 가려고 시도했고 거래가 주문 범주 에서 미결 포지션 으로 이동했다는 것을 깨닫고 PositionGet을 통해 갔습니다.... () 그러나 다시 아무 것도 작동하지 않았습니다.

이제 HistoryDealGet...()을 통해 무엇을 해야 합니까? 아니면 내가 뭔가를 이해하지 못하고 있습니까? 테스터의 공개 거래에서 SL을 수정하려면 어디로 가야 하나요? 의견에 미리 감사드립니다.

 PositionSelect ( Symbol ())
 

코를 때려주세요!!!! MQL5에서 차트의 그래픽 개체(예 : 추세선 또는 수직선)의 존재(또는 부재)를 확인하는 방법은 무엇입니까?

이상적으로는 "주문이 존재하지 않는 경우" 또는 "주문이 존재하는 경우"와 같은 논리를 만들고 싶습니다.

 
aleks557 :

코를 박아주세요!!!! MQL5에서 차트의 그래픽 개체(예 : 추세선 또는 수직선)의 존재(또는 부재)를 확인하는 방법은 무엇입니까?

이상적으로는 "주문이 존재하지 않는 경우" 또는 "주문이 존재하는 경우"와 같은 논리를 만들고 싶습니다.

https://www.mql5.com/ru/docs/constants/chartconstants/enum_chartevents
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
pako :
고맙습니다! 모든 것이 작동합니다)).
 

구매 알고리즘을 올바르게 구현하는 방법을 알려주십시오.

이제 고문은 신호가 올 때 여러 번 매수합니다. 정보가 올 때까지 열린 포지션 이 있지만 늦었습니다. 어드바이저가 최초 구매 후 거래소의 응답을 기다리게 하는 방법(조건 발생 시).

이제 문제는 Bye_opened 변수가 true 가 되어야 하고 이것이 정지에 도달할 때까지 EA가 추가 거래를 하지 않도록 해야 한다는 것입니다. 하지만 가변적인 변화 Bye_opened 발생 오랫동안 고문은 여러 번 거래를 처리합니다 . .


내 코드에서 누락된 것은 무엇입니까? 결함을 지적하십시오.


 //--- Do we have positions opened already?
   bool Buy_opened= false ;   // variable to hold the result of Buy opened position
   bool Sell_opened= false ; // variables to hold the result of Sell opened position

   if ( PositionSelect ( _Symbol )== true ) // we have an opened position
     {
       if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY )
        {
         Buy_opened= true ;   //It is a Buy
        }
       else if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_SELL )
        {
         Sell_opened= true ; // It is a Sell
        }
     }

//+------------------------------------------------------------------+
//|   СОВЕРШАЕМ СДЕЛКУ                                               |
//+------------------------------------------------------------------+
                  
     if (last_tick.last < BBLow[ 2 ] && Buy_opened == false )
        {
         int znak = last_tick.last - BBLow[ 2 ];

       //--- 1. Создать запрос
         
         MqlTradeRequest Trade_reqst={ 0 };             // Инициализация структуры торгового запроса
         Trade_reqst.action= TRADE_ACTION_DEAL ;       // Тип: немедленное совершение сделки
         Trade_reqst.symbol= _Symbol ;                 // Инструмент: текущий
         Trade_reqst.volume=Lot;                     // Объём: 1 лот
         Trade_reqst.price= SymbolInfoDouble ( _Symbol , SYMBOL_ASK )-TakeProfit* _Point ; // Цена исполнения
         Trade_reqst.type= ORDER_TYPE_BUY ;             // Тип ордера: на продажу
         Trade_reqst.type_filling= ORDER_FILLING_RETURN ; // Политика исполнения 
         Trade_reqst.sl=last_tick.last - StopLoss * _Point ;   // Stop Loss
         Trade_reqst.tp= SymbolInfoDouble ( _Symbol , SYMBOL_ASK ) + TakeProfit * _Point ; // Take Profit
       // Trade_reqst.tp=Trade_reqst.price + TakeProfit * 2 * _Point; // Take Profit
       //--- 2. Отправить торговый приказ
         MqlTradeResult Trade_reslt={ 0 };             // Инициализация структуры результата торгового запроса
         OrderSend (Trade_reqst,Trade_reslt);         // Отправка торгового запроса на сервер
   //--- выведем в лог ответ сервера  
   //Print(__FUNCTION__," - : - ",Trade_reslt.comment);
   if (Trade_reslt.retcode== 10016 ) Print ( "Ответ: " ,Trade_reslt.bid,Trade_reslt.ask,Trade_reslt.price);
 
mavar :

이제 문제는 Bye_opened 변수가 true 가 되어야 하고 EA가 정지에 도달할 때까지 추가 거래를 하지 않도록 해야 한다는 것입니다. 하지만 가변적인 변화 Bye_opened 발생 오랫동안 고문은 여러 번 거래를 처리합니다 . .

변수 변경에 시간이 오래 걸린다는 사실... 어떻게 결정하셨나요? 좋아, 그런 척 하자. 그러면 질문에 답이 있습니다. 포지션을 열려면 지연이 필요하므로 Sleep( N )을 입력하십시오. 여기서 N은 실험적으로 계산됩니다.

옵션 번호 2. 답은 다시 질문에 있습니다. Bye_opened를 전역으로 만들고 위치를 성공적으로 연 직후 동일한 모듈에서 변경하십시오. 위치가 있는지 확인하는 것과 같은 방법으로 재설정합니다.  

 
papaklass :
...

라인을 넣으면

명령 후: OrderSend(), 그러면 위치가 다시 열리지 않습니다.

개봉 여부를 먼저 확인하고 그 다음에야...

???

 
papaklass :

분명히 그의 로봇은 모든 틱에서 작동합니다. 서버에 주문을 보내고 서버로부터 응답을 받는 사이에 몇 개의 틱이 더 올 것이고 각각에 대해 추가 위치가 열릴 것입니다. 내 제안은 재발견의 상황을 제외합니다. 그리고 포지션 이 열렸는지 여부를 확인하는 것이 필요합니다.

그래서 나는 같은 것에 대해 이야기하고 있습니다. 그렇지 않으면 그는 문자 그대로 모든 것을 이해하고 중요한 수표를 놓칠 것입니다.
 
artmedia70 :
그래서 나는 같은 것에 대해 이야기하고 있습니다. 그렇지 않으면 그는 문자 그대로 모든 것을 이해하고 중요한 수표를 놓칠 것입니다.

그렇다면 올바른 확인 방법은 무엇일까요? 미안 해요, 난 그것을 극복할 수 없습니다.

다음은 코드입니다(모든 것은 OnTick 블록에 있습니다):


 void OnTick ()
  {

       MqlTick last_tick;
     
       if ( SymbolInfoTick ( Symbol (),last_tick))
        {
         // Print(last_tick.time,": Bid = ",last_tick.bid,
         //       " Ask = ",last_tick.ask,"  Volume = ",last_tick.volume, "  LastPrice = ",last_tick.last );
        }
       else Print ( "SymbolInfoTick() failed, error = " , GetLastError ());
       //---
      
         //---Читаем свечку
   MqlRates rates[];
   ArraySetAsSeries (rates, true );
   int copied= CopyRates ( Symbol (), 0 , 0 , 1 ,rates);
   if (copied> 0 )
     {
       //Print("Скопировано баров: "+copied);
       string format= "open = %G, high = %G, low = %G, close = %G, volume = %d" ;
       string out;
       int size= fmin (copied, 10 );
       for ( int i= 0 ;i<size;i++)
        {
         //out=i+":"+TimeToString(rates[i].time);
         out=out+ " " + StringFormat (format,
                                  rates[i].open,
                                  rates[i].high,
                                  rates[i].low,
                                  rates[i].close,
                                  rates[i].tick_volume);
         // Print(out);
       
         //Print(rates[i].open - rates[i].close );

        }
     }
   else Print ( "Не удалось получить исторические данные по символу " , Symbol ());

//---=======-----\_____BOLLINGER____/--------========--//
//--- получить хэндл индикатора Bollinger Bands и DEMA
      BolBandsHandle= iBands ( NULL ,my_timeframe,bands_period,bands_shift,deviation, PRICE_LOW );
       ChartIndicatorAdd ( 0 , 0 ,BolBandsHandle);
   
//--- копируем новые значения индикаторов используя хэндлы
   if ( CopyBuffer (BolBandsHandle, 0 , 0 , 3 ,BBMidle)< 0 || CopyBuffer (BolBandsHandle, 1 , 0 , 3 ,BBUp)< 0
      || CopyBuffer (BolBandsHandle, 2 , 0 , 3 ,BBLow)< 0 )
     {
       Alert ( "Ошибка копирования буферов индикатора Bollinger Bands - номер ошибки:" , GetLastError (), "!!" );
       return ;
     }
//********** это цикл надо добавить в код советника, выводит значения при наступлении нового бара
   //for(int nbar=0; nbar < 3; nbar++)
     // Print("nbar=", nbar, "  BBLow[nbar]=", DoubleToString(BBLow[nbar], _Digits), "  BBMidle[nbar]", DoubleToString(BBMidle[nbar], _Digits),
   //                 "  BBUp[nbar]=", DoubleToString(BBUp[nbar], _Digits));
      
      
   //--- Define some MQL5 Structures we will use for our trade
   MqlTick latest_price;       // To be used for getting recent/latest price quotes
   
       
   //--- Do we have positions opened already?
   bool Buy_opened= false ;   // variable to hold the result of Buy opened position
   bool Sell_opened= false ; // variables to hold the result of Sell opened position

   if ( PositionSelect ( _Symbol )== true ) // we have an opened position
     {
       if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY )
        {
         Buy_opened= true ;   //It is a Buy
        }
       else if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_SELL )
        {
         Sell_opened= true ; // It is a Sell
        }
     }

//+------------------------------------------------------------------+
//|   СОВЕРШАЕМ СДЕЛКУ                                               |
//+------------------------------------------------------------------+
                  
     if (last_tick.last < BBLow[ 2 ]-natyajka && Buy_opened == false )
        {
         int znak = last_tick.last - BBLow[ 2 ];

       //--- 1. Создать запрос
         
         MqlTradeRequest Trade_reqst={ 0 };             // Инициализация структуры торгового запроса
         Trade_reqst.action= TRADE_ACTION_DEAL ;       // Тип: немедленное совершение сделки
         Trade_reqst.symbol= _Symbol ;                 // Инструмент: текущий
         Trade_reqst.volume=Lot;                     // Объём: 1 лот
         Trade_reqst.price= SymbolInfoDouble ( _Symbol , SYMBOL_ASK )-TakeProfit* _Point ; // Цена исполнения
         Trade_reqst.type= ORDER_TYPE_BUY ;             // Тип ордера: на продажу
         Trade_reqst.type_filling= ORDER_FILLING_RETURN ; // Политика исполнения 
         Trade_reqst.sl=last_tick.last - StopLoss * _Point ;   // Stop Loss
         Trade_reqst.tp= SymbolInfoDouble ( _Symbol , SYMBOL_ASK ) + TakeProfit * _Point ; // Take Profit
       // Trade_reqst.tp=Trade_reqst.price + TakeProfit * 2 * _Point; // Take Profit
       //--- 2. Отправить торговый приказ
         MqlTradeResult Trade_reslt={ 0 };             // Инициализация структуры результата торгового запроса
         OrderSend (Trade_reqst,Trade_reslt);         // Отправка торгового запроса на сервер
   //--- выведем в лог ответ сервера  
   //Print(__FUNCTION__," - : - ",Trade_reslt.comment);
   if (Trade_reslt.retcode== 10016 ) Print ( "Ответ: " ,Trade_reslt.bid,Trade_reslt.ask,Trade_reslt.price);

//--- вернем код ответа торгового сервера
         Print ( "Покупаю. Buy_opened = " , Buy_opened);
         Print ( "last_tick.last= " , last_tick.last, 
               " last_tick.ask= " , last_tick.ask, " - " ,    
               " BBLow= " , DoubleToString (BBLow[ 2 ], _Digits ) , 
               " SYMBOL_BID=" , SymbolInfoDouble ( _Symbol , SYMBOL_BID ),
               " SYMBOL_ASK=" , SymbolInfoDouble ( _Symbol , SYMBOL_ASK ), 
               " StopLoss=" , StopLoss,
               " TakeProfit=" , TakeProfit,
               " Trade_reslt.bid=" , Trade_reslt.bid,
               " Trade_reslt.bid=" , Trade_reslt.bid,
               " Trade_reslt.ask=" , Trade_reslt.ask
            ); 

      
   //return Trade_reslt.retcode;

         
        }

  } 
 
papaklass :

추가 볼륨을 열지 않으려면:

불행히도, 이 조건은 거래를 열 때 작동하지 않습니다.

       //проверка выполнения торгового приказа
       if (Trade_reslt.retcode== 10009 )   //заявка выполнена
      {
         Bye_opened = true ;
      }

사유: