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

 
Artyom Trishkin :

이 바에서 아직 포지션이 열리지 않았는지 어떻게 확인합니까?

Alexey Vazhmikin의 기능을 약간 수정하고 다음과 같은 방식으로 새 막대에서 위치를 여는 것을 제어하는 구조를 추가할 수 있습니다.

 struct open_bar {
   bool      IsPositionOpened; // Flag
   int       bn;               // Bar Number
   datetime bot;               // Bar Open Time
   double    bop;               // Bar Open Price
}; 
open_bar BarOpen;

//+------------------------------------------------------------------------------------------------------------------+
//| Возвращает TRUE, если появился новый бар на текущем ТФ
//+------------------------------------------------------------------------------------------------------------------+
bool isNewBar()
  {
   datetime tm[];
   static datetime prevBarTime= 0 ;

   if ( CopyTime ( _Symbol , 0 , 0 , 1 ,tm)< 0 )
     {
       Print ( "%s CopyTime error = %d" , __FUNCTION__ , GetLastError ());
     }
   else
     {
       if (prevBarTime!=tm[ 0 ])
        {
         prevBarTime=tm[ 0 ];
         BarOpen.IsPositionOpened= false ;
         BarOpen.bn++;
         BarOpen.bot= iTime ( NULL , PERIOD_CURRENT , 0 );
         BarOpen.bop= iOpen ( NULL , PERIOD_CURRENT , 0 );
         return true ;
        }
       return false ;
     }
   return true ;
  }

그런 다음 성공적으로 포지션을 열면 Expert Advisor에서 제어 플래그를 올리십시오.

BarOpen.IsPositionOpened= true ;

다음 위치를 열기 전에 제어하십시오. 그래서 더 믿음직스럽겠죠?

 
Grigori.SB :

두 번째 위치는 첫 번째 직후에 열리며 같은 초에 티켓이 하나씩 다릅니다.

 

도와 주셔서 감사합니다. 나는 모든 것을 자세히 공부했습니다. 각 거래 요청 후 5초의 지연이 있지만 여전히 도움이 되지 않습니다. 문제는 ICMarkets 데모 MT5 헤지에만 있습니다. 나는 수표를 추가하고 상태 투표의 결과를 표시할 것입니다. 같은 서버에 접속했는데도 제 스스로 문제를 재현할 수 없고 고객이 정기적으로 문제를 가지고 있다는 사실이 상황을 악화시킵니다.

 
안녕하세요 여러분! 심페로폴에서 온 사람 있나요???
 
Олег Юдин :
안녕하세요 여러분! 심페로폴에서 온 사람 있나요???

그리고 여전히 MQL5 학습에 도움이 될 것이라고 생각합니다. :) . 다음은 MQL5 프로그래밍을 위한 포럼이지만 데이트 클럽은 아닙니다.

 
Vladimir Karputov :

그리고 여전히 MQL5 학습에 도움이 될 것이라고 생각합니다. :) . 다음은 MQL5 프로그래밍을 위한 포럼이지만 데이트 클럽은 아닙니다.

아니요, 저는 이미 mql5 프로그래밍에 정통합니다. 완벽하지는 않지만 나쁘지는 않습니다!!!
 
Grigori.SB :

도와 주셔서 감사합니다. 나는 모든 것을 자세히 공부했습니다. 각 거래 요청 후 5초의 지연이 있지만 여전히 도움이 되지 않습니다. 문제는 ICMarkets 데모 MT5 헤지에만 있습니다. 나는 수표를 추가하고 상태 투표의 결과를 표시할 것입니다. 같은 서버에 접속했는데도 제 스스로 문제를 재현할 수 없고 고객이 정기적으로 문제를 가지고 있다는 사실이 상황을 악화시킵니다.

나는 이것이 클라이언트의 연결 품질, 예를 들어 큰 핑과 어떻게 든 관련이 있다고 생각합니다. 실제로 5초의 지연이 있지만 코드에서 이해하는 것처럼 필요한 위치가 아닙니다. m_trade 클래스는 무엇을 반환합니까? 티켓 번호? 아니면 참인가 거짓인가? 이 개체가 반환한 결과를 확인해야 하지만 서버와의 통신 지연으로 인해 긍정적인 응답이 아직 도착하지 않았다고 상상해 보십시오. if 문을 실행한 결과는 어떻게 될까요? 분명히 거짓이며 결과적으로 루프는 5초 안에 두 번째 반복으로 이동합니다. 그리고 이때 드디어 서버에서 응답이 오지만 이미 두 번째 반복이 시작되고 비슷한 위치를 열라는 두 번째 요청이 진행됩니다. 주문 개시 시간에 약간의 델타가 있다는 사실은 두 주문이 차트에서 상쇄된다는 사실에 의해 입증됩니다. 즉, 다른 시간과 다른 가격으로 실행되었음을 의미합니다.

 
Grigori.SB :

같은 서버에 접속했는데도 제 스스로 문제를 재현할 수 없고 고객이 정기적으로 문제를 가지고 있다는 사실이 상황을 악화시킵니다.

막대에서 기호당 하나의 위치를 확인하십시오. 대부분의 경우 문제를 해결할 수 있습니다.

 
Konstantin Nikitin :

막대에서 기호당 하나의 위치를 확인하십시오. 대부분의 경우 문제를 해결할 수 있습니다.

또 다른 걸림돌이 있습니다. 이 상황에서는 목발을 발명하는 것보다 MT4 스타일로 다시 작성하는 것이 더 쉽습니다.

 

모두 좋은 하루!

다음은 Metatrader5에 대한 스크립트 코드의 일부입니다.

 #property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
//---- показывать входные параметры
#property script_show_inputs
//---
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
CTrade         m_trade;                       // trading object
CSymbolInfo    m_symbol;                     // symbol info object
//+------------------------------------------------------------------+
//| Enum Stop or Limit                                               |
//+------------------------------------------------------------------+
enum ENUM_STOP_OR_LIMIT
  {
   stop= 0 ,     // Buy stop and Sell stop
   limit= 1      // Buy limit and Sell limit
  };
//--- input parameters
input ushort                InpUpGap          = 15 ;     // Gap for pending orders UP from the current price (in points)
input ushort                InpUpStep         = 30 ;     // Step between orders UP (in points)

input ushort                InpDownGap        = 15 ;     // Gap for pending orders DOWN from the current price (in points)
input ushort                InpDownStep       = 30 ;     // Step between orders DOWN (in points)

input ENUM_STOP_OR_LIMIT   InpPending        = stop;   // Type of pending orders

input uchar                 InpUpQuantity     = 1 ;     // UP quantity orders
input uchar                 InpDownQuantity   = 1 ;     // DOWN quantity orders

input double                InpLots           = 0.01 ;   // Lots
input ushort                InpStopLoss       = 50 ;     // Stop Loss (in points)
input ushort                InpTakeProfit     = 50 ;     // Take Profit (in points)
//---
ulong                       m_slippage= 30 ;             // slippage

double                      ExtUpGap= 0.0 ;
double                      ExtUpStep= 0.0 ;

double                      ExtDownGap= 0.0 ;
double                      ExtDownStep= 0.0 ;

double                      ExtStopLoss= 0.0 ;
double                      ExtTakeProfit= 0.0 ;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//---
   if (InpLots<= 0.0 )
     {
       Print ( "The \"Lots\" can't be smaller or equal to zero" );
       return ;
     }
//---
   if (!m_symbol.Name( Symbol ())) // sets symbol name
       return ;
   if (!RefreshRates())
       return ;

   string err_text= "" ;
   if (!CheckVolumeValue(InpLots,err_text))
     {
       Print (err_text);
       return ;
     }

//---
   if (IsFillingTypeAllowed( SYMBOL_FILLING_FOK ))
      m_trade.SetTypeFilling( ORDER_FILLING_FOK );
   else
       if (IsFillingTypeAllowed( SYMBOL_FILLING_IOC ))
         m_trade.SetTypeFilling( ORDER_FILLING_IOC );
       else
         m_trade.SetTypeFilling( ORDER_FILLING_RETURN );

//---
   m_trade.SetDeviationInPoints(m_slippage);
   m_trade.SetAsyncMode( true );

//---
   ExtUpGap = m_symbol. Point () * InpUpGap;
   ExtUpStep = m_symbol. Point () * InpUpStep;

   ExtDownGap = m_symbol. Point () * InpDownGap;
   ExtDownStep = m_symbol. Point () * InpDownStep;

   ExtStopLoss = m_symbol. Point () * InpStopLoss;
   ExtTakeProfit = m_symbol. Point () * InpTakeProfit;

//--- start work
   double start_price_ask=m_symbol.Ask()-ExtUpGap;
   double start_price_bid=m_symbol.Bid()+ExtDownGap;

//--- set pending orders
   for ( int i= 0 ; i<InpUpQuantity; i++)
     {
       double price_ask = start_price_ask+i*ExtUpStep;
       double price_bid = start_price_bid+i*ExtUpStep;
       if (InpPending==stop)
        {
         double sl = (ExtStopLoss== 0.0 )   ? 0.0 : price_ask - ExtStopLoss;
         double tp = (ExtTakeProfit== 0.0 ) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyStop(InpLots,m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
         m_symbol.NormalizePrice(sl),
         m_symbol.NormalizePrice(tp));
        }
       else
        {
         double sl = (ExtStopLoss== 0.0 )   ? 0.0 : price_bid + ExtStopLoss;
         double tp = (ExtTakeProfit== 0.0 ) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellLimit(InpLots,m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
         m_symbol.NormalizePrice(sl),
         m_symbol.NormalizePrice(tp));
        }
     }

   for ( int i= 0 ; i<InpDownQuantity; i++)
     {
       double price_ask = start_price_ask-i*ExtDownStep;
       double price_bid = start_price_bid-i*ExtDownStep;
       if (InpPending==limit)
        {
         double sl = (ExtStopLoss== 0.0 )   ? 0.0 : price_ask - ExtStopLoss;
         double tp = (ExtTakeProfit== 0.0 ) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyLimit(InpLots,m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
         m_symbol.NormalizePrice(sl),
         m_symbol.NormalizePrice(tp));
        }
       else
        {
         double sl = (ExtStopLoss== 0.0 )   ? 0.0 : price_bid + ExtStopLoss;
         double tp = (ExtTakeProfit== 0.0 ) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellStop(InpLots,m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
         m_symbol.NormalizePrice(sl),
         m_symbol.NormalizePrice(tp));
        }
     }
  }


질문이 생겼습니다.

1. 계획대로 스크립트는 매도호가와 매수호가로부터 특정 거리에 보류 중인 지정가 주문 또는 정지 주문을 배치해야 합니다. 한도 보류 주문 은 문제 없이 설정되지만 스탑 주문은 그렇지 않습니다. 구매 중지 및 판매 중지 보류 주문이 설정되지 않은 이유를 알아내도록 도와주세요.

2. 마켓이 닫힐 때(예: 주말) 스크립트를 테스트할 수 있는 방법이 있습니까?

안부 인사를 전합니다. 블라디미르.