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

 

안녕하세요, 저는 OrderCalcProfit 시스템 기능의 이상한 동작을 관찰했습니다. 계산하는 동안 볼륨 매개변수가 무시된 것 같습니다. 즉, 이익 크기는 항상 볼륨 1.0에 대해 계산됩니다.

다른 데모 계정에서 다른 통화 쌍에 대해 테스터를 확인합니다.

1. 1.0의 경우 계산이 올바르게 수행됩니다. calc_profi101.png를 참조하십시오.

2. 두 번째 및 후속 함수 호출 은 볼륨 1.0을 기반으로 하는 이익 결과를 반환하고 볼륨 값은 무시됩니다. printscreen 참조(calc_profit02.png) - 볼륨 0.5가 전달되었지만 결과는 1.0

무엇이 문제일 수 있는지 말해 주십시오. 감사해요

파일:
 
aveshoff :

안녕하세요, 저는 OrderCalcProfit 시스템 기능의 이상한 동작을 관찰했습니다. 계산하는 동안 볼륨 매개변수가 무시된 것 같습니다. 즉, 이익 크기는 항상 볼륨 1.0에 대해 계산됩니다.

다른 데모 계정에서 다른 통화 쌍에 대해 테스터를 확인합니다.

1. 1.0의 경우 계산이 올바르게 수행됩니다. calc_profi101.png를 참조하십시오.

2. 두 번째 및 후속 함수 호출 은 볼륨 1.0을 기반으로 하는 이익 결과를 반환하고 볼륨 값은 무시됩니다. printscreen 참조(calc_profit02.png) - 볼륨 0.5가 전달되었지만 결과는 1.0

무엇이 문제일 수 있는지 말해 주십시오. 감사해요

도움말에 답이 있다고 생각합니다.

"... 이익

[out] 함수가 성공적으로 실행되었을 때 계산된 이익 값이 기록될 변수. 이익 추정치의 가치는 많은 요인에 따라 달라지며 시장 환경의 변화에 따라 변경될 수 있습니다 . ... "


추가됨: 이것은 단지 추측일 뿐이지만.

 
aveshoff :

안녕하세요, 저는 OrderCalcProfit 시스템 기능의 이상한 동작을 관찰했습니다. 계산하는 동안 볼륨 매개변수가 무시된 것 같습니다. 즉, 이익 크기는 항상 볼륨 1.0에 대해 계산됩니다.

다른 데모 계정에서 다른 통화 쌍에 대해 테스터를 확인합니다.

1. 1.0의 경우 계산이 올바르게 수행됩니다. calc_profi101.png를 참조하십시오.

2. 두 번째 및 후속 함수 호출 은 볼륨 1.0을 기반으로 하는 이익 결과를 반환하고 볼륨 값은 무시됩니다. printscreen 참조(calc_profit02.png) - 볼륨 0.5가 전달되었지만 결과는 1.0

무엇이 문제일 수 있는지 말해 주십시오. 감사해요

다음은 검증 전문가입니다. 모든 것이 올바르게 작동합니다.

 //+------------------------------------------------------------------+
//|                                             OrderProfitCheck.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.00"
#include <Trade\AccountInfo.mqh>
CAccountInfo      m_account;                     // object of CAccountInfo class
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   string symbol= Symbol ();
   ENUM_ORDER_TYPE trade_operation= ORDER_TYPE_BUY ;
   double volume= 1.0 ;
   double price_open= 1.09350 ;
   double price_close= 1.0930 ;
   double profit=m_account.OrderProfitCheck(symbol,trade_operation,volume,price_open,price_close);
   Print ( "Volume 1.0, profit -> " , DoubleToString (profit, 2 ));
   volume= 0.5 ;
   profit=m_account.OrderProfitCheck(symbol,trade_operation,volume,price_open,price_close);
   Print ( "Volume 0.5, profit -> " , DoubleToString (profit, 2 ));
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---

  }
//+------------------------------------------------------------------+

결과:

 2019.09 . 30 07 : 47 : 21.688 OrderProfitCheck (EURUSD,H1)    Volume 1.0 , profit -> - 50.00
2019.09 . 30 07 : 47 : 21.688 OrderProfitCheck (EURUSD,H1)    Volume 0.5 , profit -> - 25.00
파일:
 
말하다. 사용 중인 터미널의 언어를 프로그래밍 방식으로 배우는 것이 가능하고 어떻게 해야 합니까?
 
Uladzimir Izerski :
말하다. 사용 중인 터미널의 언어를 프로그래밍 방식으로 배우는 것이 가능하고 어떻게 해야 합니까?

나는 그것을 터미널의 러시아어로 정의하거나 다르면 영어 로 정보를 출력 합니다.

   if (InpTrailingStop!= 0 && InpTrailingStep== 0 )
     {
       string err_text=( TerminalInfoString ( TERMINAL_LANGUAGE )== "Russian" )?
                       "Трейлинг невозможен: параметр \"Trailing Step\" равен нулю!" :
                       "Trailing is not possible: parameter \"Trailing Step\" is zero!" ;
       //--- when testing, we will only output to the log about incorrect input parameters
       if ( MQLInfoInteger ( MQL_TESTER ))
        {
         Print ( __FILE__ , " " , __FUNCTION__ , ", ERROR: " ,err_text);
         return ( INIT_FAILED );
        }
       else // if the Expert Advisor is run on the chart, tell the user about the error
        {
         Alert ( __FILE__ , " " , __FUNCTION__ , ", ERROR: " ,err_text);
         return ( INIT_PARAMETERS_INCORRECT );
        }
     }


추가: TERMINAL_LANGUAGE 열거형에서 모든 언어를 저장한 줄 알았는데 찾을 수 없습니다. 아마 분실...

 
모두 좋은 오후입니다. 누구든지 여기에 추가하여 SL을 사용하면 쿠데타가 아니라 여러 개를 추가할 수 있습니다. 그리고 그것이 작동함에 따라 TP는 한 로트를 반환했습니다.
 input double    Lot= 1 ;
input int       TakeProfit = 6 ;
input int       Stoploss   = 6 ;

int TP;
int SL;

CTrade trader;
bool Invertor;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {

   TP = TakeProfit;
   SL = Stoploss;

   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {

   double points;

   if (! PositionSelect ( _Symbol ))
     {
       if (Invertor)
         trader.Buy(Lot);
       else trader.Sell(Lot);
     }
   else
     {
       if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY )
        {
         points=( SymbolInfoDouble ( _Symbol , SYMBOL_BID )- PositionGetDouble ( POSITION_PRICE_OPEN ))/ _Point ;
         if (points>=TP)
           {
            trader.PositionClose( _Symbol );
            Invertor= true ;
           }

         if (points<=-SL)
           {
            trader.PositionClose( _Symbol );
            Invertor= false ;
           }
        }
       if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_SELL )
        {
         points=( PositionGetDouble ( POSITION_PRICE_OPEN )- SymbolInfoDouble ( _Symbol , SYMBOL_ASK ))/ _Point ;
         if (points>=TP)
           {
            trader.PositionClose( _Symbol );
            Invertor= false ;
           }
         if (points<=-SL)
           {
            trader.PositionClose( _Symbol );
            Invertor= true ;
           }
        }
     }   
  }
 
Andrey990 :
모두 좋은 오후입니다. 누구든지 여기에 추가하여 SL을 사용하면 쿠데타가 아니라 여러 개를 추가할 수 있습니다. 그리고 그것이 작동함에 따라 TP는 한 로트를 반환했습니다.

1. BY SYMBOL 위치를 선택하는 함수를 사용하지 않는 것이 좋습니다. 목록에서 인덱스로 위치를 선택하는 함수를 사용합니다.

2. 포지션이 어떻게 마감되었는지 알아보려면 OnTradeTransaction의 ENUM_DEAL_REASON 열거 살펴봐야 합니다.

ENUM_DEAL_REASON의 예:

손절매 이익실현

손절매로 마감하는 경우 - 거래량을 두 배로, 이익실현으로 마감하는 경우 - 최소 거래량을 설정합니다. 손절매 또는 이익실현에 의해 거래가 촉발되었는지 확인하려면 OnTradeTransaction을 사용하십시오. 빌드 1625부터 멋진 열거 ENUM_DEAL_REASON이 나타납니다. ENUM_DEAL_REASON 이유 설명.. DEAL_REASON_SL 이 작업은 손절매 작업 DEAL_REASON_TP의 결과로 수행되었습니다. 이 작업은 이익 실현.. 작업의 결과로 수행되었습니다. OnTradeTransaction에서 추적됩니다. 다시 말해서, 이제 매우 쉽고 가장 중요한 것은 이 거래가 이익실현 또는 손절매 트리거의 결과임을 결정하는 것이 보장된다는 것입니다. 현재(빌드 1626) 이 EA는 차트에 던지거나 실제 데이터의 디버그 모드에서(메타에디터에서 F5) 라이브로만 테스트할 수 있습니다. 또한 해결 방법을 적용하는 동안: 정확히 무엇이 효과가 있었는지 확인: OnTradeTransaction 절차에서 이익 실현 또는 손절매: if (deal_symbol==m_symbol...

코드베이스 | 2017.07.13 07:42 | 블라디미르 카르푸토프 | 고문 | 메타 트레이더 5

 

어떻게든 데이터를 입력하여 계정을 타사 프로그램에 입력하고 관리할 수 있습니까? 글쎄요, 포지션을 열거나 닫을 수 있습니까?

아니면 계정에 설치된 로봇을 통해서만 가능한가요?

 

버퍼 및 "플롯"에 대한 질문인 MQL4에서 MQL5로 지표를 번역하고 있습니다. 표시기는 2개의 버퍼와 1개의 플롯을 포함합니다.

#속성 표시기_버퍼 2
#property indicator_plots 1

SetIndexBuffer(0,Array1,INDICATOR_CALCULATIONS);
SetIndexBuffer(1,Array2,INDICATOR_DATA);


첫 번째 버퍼가 계산 등에 사용되고 두 번째 버퍼를 그려야 하는 경우:

먼저 SetIndexBuffer() 함수에 INDICATOR_CALCULATIONS가 이미 설정된 경우 첫 번째 버퍼를 DRAW_NONE으로 설정해야 합니까?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_NONE);

둘째, 두 번째 버퍼만 그려야 하는 경우 물음표( ? ) 대신 PlotIndexSetInteger() 함수 에서 어떤 인덱스를 설정해야 합니까?

PlotIndexSetInteger( ? ,PLOT_DRAW_TYPE,DRAW_HISOGRAM);


세 번째로, DRAW_HISTOGRAM 유형의 두 가지 스타일을 사용하는 경우 각각에 대한 색상을 설정하고 볼륨 표시기에서와 같이 히스토그램을 얻을 수 있습니다. 여기서 녹색과 빨간색 막대가 교대로 표시됩니다. DRAW_HISTOGRAM 2 를 사용하면 두 가지 색상도 설정할 수 있습니다. 하나의 막대로 또는 이 스타일에 하나의 색상만 있습니까?

 
The_Sheikh :

버퍼 및 "플롯"에 대한 질문인 MQL4에서 MQL5로 지표를 번역하고 있습니다. 표시기는 2개의 버퍼와 1개의 플롯을 포함합니다.

#속성 표시기_버퍼 2
#property indicator_plots 1

SetIndexBuffer(0,Array1,INDICATOR_CALCULATIONS);
SetIndexBuffer(1,Array2,INDICATOR_DATA);


첫 번째 버퍼가 계산 등에 사용되고 두 번째 버퍼를 그려야 하는 경우:

먼저 SetIndexBuffer() 함수에 INDICATOR_CALCULATIONS가 이미 설정된 경우 첫 번째 버퍼를 DRAW_NONE으로 설정해야 합니까?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_NONE);

둘째, 두 번째 버퍼만 그려야 하는 경우 물음표( ? ) 대신 PlotIndexSetInteger() 함수 에서 어떤 인덱스를 설정해야 합니까?

PlotIndexSetInteger( ? ,PLOT_DRAW_TYPE,DRAW_HISTOGRAM);


세 번째로, DRAW_HISTOGRAM 유형의 두 가지 스타일을 사용하는 경우 각각에 대한 색상을 설정하고 볼륨 표시기에서와 같이 히스토그램을 얻을 수 있습니다. 여기서 녹색과 빨간색 막대가 교대로 표시됩니다. DRAW_HISTOGRAM 2 를 사용하면 두 가지 색상도 설정할 수 있습니다. 하나의 막대로 또는 이 스타일에 하나의 색상만 있습니까?

왜 그렇게 자신을 놀려? 디스플레이 버퍼를 먼저 할당한 다음 보조 버퍼를 할당하는 데 문제가 있습니까?

DRAW_HISTOGRAM2에는 3개의 버퍼와 필수 시퀀스가 제공됩니다. 처음 2개의 값 버퍼와 그 뒤에 컬러 버퍼가 있습니다. 그러나 DRAW_HISTOGRAM과 DRAW_HISTOGRAM2 사이에는 DRAW_HISTOGRAM이 0에서 버퍼의 값으로 그려지고 DRAW_HISTOGRAM2가 1의 값에서 그려지는 것과 같은 차이가 있습니다. 버퍼를 다른 버퍼의 값으로 변경합니다.