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

 
  1. 대부분의 브로커는 계좌가 적자가 나기 전에 모든 포지션이 (자동으로?) 청산되기 때문에 더 이상 마진콜을 발행하지 않습니다(돈을 추가해야 합니다: 마진콜).
  2. 마진은 오픈 포지션에 대한 예치금으로 간주되는 금액이며, 계좌_마진_프리는 나머지(미사용 부분)입니다.
  3. 자본 부족으로 인한 포지션 청산 및 포지션 손실을 방지하기 위해 계좌 잔고(잔액) 또는 자본 잔고(계좌 잔고 + 개설된 포지션, 자기자본)의 최대 5%에서 10%를 거래에 사용해야 합니다.
  4. 포지션의 위험은 SL과 랏 크기에 따라 달라지며, SL은 일반적으로 기술적인 이유로 고정되어 있으므로 랏 크기를 사용하여 위험을 계산합니다:
    "랏 크기 계산" 검색: https://www.mql5.com/en/search#!keyword=calculate%20lotsize&module=mql5_module_forum
  5. 팁 대부분의 문서는 독일어로도 제공되므로 URL의 /en/을 /de/로 바꾸기만 하면 됩니다: https://www.mql5.com/de/articles/2555
[삭제]  
정보 감사합니다. 거래 로봇이 통과해야 하는 검사에는 거래에 사용할 증거금이 여유 증거금(ACCOUNT_FREE_MARGIN)보다 큰지 확인하는 "CheckMoneyForTrade" 메서드가 언급되어 있습니다. 내가 올바르게 이해했다면 사용 된 자금이 계좌 잔액의 특정 비율을 초과하는지 여부도 확인해야합니다:
 if (freeMargin - tradeMargin < balance * 0.9) return false;

물론 0.9를 (1 - maxRisk)로 변경하고 사용자가 설정할 수 있는 "최대 위험도(%)" 속성을 구현할 수 있습니다.

추신: 포럼에서 이름을 사용하시나요, 아니면 성을 사용하시나요?
 
Benjamin Fotteler #:
정보 감사합니다. 거래 로봇이 통과해야 하는 검사에는 거래에 사용할 증거금이 여유 증거금(ACCOUNT_FREE_MARGIN)보다 큰지 확인하는 "CheckMoneyForTrade" 메서드가 언급되어 있습니다. 제가 올바르게 이해했다면 사용된 자금이 계좌 잔액의 일정 비율을 초과하는지 여부도 확인해야 합니다:

물론 0.9를 (1 - maxRisk)로 변경하고 사용자가 설정할 수 있는 "최대 위험도(%)" 속성을 구현할 수 있습니다.

추신: 여기 포럼에서는 이름 단위로 말하나요, 아니면 이름 단위로 말하나요?

모두가 로트 크기에 대해 비틀 거리고 여기에 많은 코드와 의견이 있습니다!

이제 윌리엄 로더가 MT5용으로 작성한 테스트되지 않은(!!) 함수인
(https://www.mql5.com/en/forum/133792/page3#comment_3405179 & https://www.mql5.com/en/forum/390088#comment_28092477)를 함께 살펴봤습니다.

double lotsz (double risk, double sl, ENUM_ORDER_TYPE ordDir, string sym="", double CommissionPerLot=0) {
   MqlTick mqTick;
   if (sym == "") sym = _Symbol;
   double deltaValue = SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_VALUE) / SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_SIZE);
   SymbolInfoTick(sym,mqTick); 
   double diff = (ordDir==ORDER_TYPE_BUY) ? mqTick.ask - sl : ( (ordDir==ORDER_TYPE_SELL) ? sl - mqTick.bid : -1.0 );
   if (diff<0.0) return(0.0);
   double lts = ( (AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk/100) / (diff * deltaValue + CommissionPerLot) );
   return( fmin(fmax(SymbolInfoDouble(sym,SYMBOL_VOLUME_MIN),lts),SymbolInfoDouble(sym,SYMBOL_VOLUME_MAX)));
}
// use: lotsz(5, sl)

실수를 발견하면 알려주세요!

여기 대부분의 사람들이 닉네임이나 이름을 익명으로 사용하고 있고 예전에는 더 그랬기 때문에 "Du"는 귀화되었습니다.

Why is there NO Complete EA within the Code-Base? - When does the market close or open?
Why is there NO Complete EA within the Code-Base? - When does the market close or open?
  • 2011.08.20
  • www.mql5.com
I wanted to close all orders before end of the week (market close friday,) to prevent loss should the market gap over the week end, by passing the sl. ) so the question is when does the market close (or open. For example info on opened charts and history data, time info (like gmt, timezone, dst), market open, close info
[삭제]  

코드를 제공해 주셔서 감사합니다. 유일하게 빠진 것은 유효한 중간 로트 크기에 맞게 조정하는 것이었습니다:

double lotsz (double risk, double sl, ENUM_ORDER_TYPE ordDir, string sym="", double CommissionPerLot=0) {
   MqlTick mqTick;
   if (sym == "") sym = _Symbol;
   double deltaValue = SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_VALUE) / SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_SIZE);
   SymbolInfoTick(sym,mqTick); 
   double diff = (ordDir==ORDER_TYPE_BUY) ? mqTick.ask - sl : ( (ordDir==ORDER_TYPE_SELL) ? sl - mqTick.bid : -1.0 );
   if (diff<0.0) return(0.0);
   double lts = ( (AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk/100) / (diff * deltaValue + CommissionPerLot) );
   lts = ( fmin(fmax(SymbolInfoDouble(sym,SYMBOL_VOLUME_MIN),lts),SymbolInfoDouble(sym,SYMBOL_VOLUME_MAX)));
   double stepSize = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP);
   return ((int)MathRound(lts/stepSize)*stepSize);
}
// use: lotsz(5, sl)

또 다른 질문이 있습니다. 위와 같이 TICK_VALUE 또는 deltaValue로 스톱 아웃 거래의 손실을 계산하면 결과가 항상 MQL5 내부 계산과 약간 다릅니다:

double price=(ordDir==ORDER_TYPE_BUY) ? mqTick.ask : ((ordDir==ORDER_TYPE_SELL) ? mqTick.bid : mqTick.last);
double loss;
OrderCalcProfit(ordDir, sym, 1, price, sl, loss)

이는 EUR 계좌와 시장가 1.0과 시장가 1.2의 틱당 손실/이익이 다르기 때문인가요? 예를 들어 아래 코드에서 가격 대신 "가격 + 0.1"을, sl 대신 "sl + 0.1"을 입력하면 틱 거리 (차이)는 동일하지만 OrderCalcProfit에서 출력되는 각각의 결과가 다릅니다. 그리고 수동 거래에서 얻은 수익 / 손실을 보면 후자가 확인 된 것 같습니다.

제 말이 맞다면 다음 코드가 더 정확할 것 같습니다:

double lotsz (double risk, double entry, double sl, ENUM_ORDER_TYPE ordDir, string sym="", double CommissionPerLot=0) {
   if (sym == "") sym = _Symbol;
   double loss;
   OrderCalcProfit(ordDir, sym, 1, entry, sl, loss);
   double lts = ((AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk * 0.01) / -loss);
   lts = (fmin(fmax(SymbolInfoDouble(sym, SYMBOL_VOLUME_MIN), lts), SymbolInfoDouble(sym, SYMBOL_VOLUME_MAX)));
   double stepSize = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP);
   return ((int)MathRound(lts / stepSize) * stepSize);
}
// use: lotsz(5, ask, sl)
추신 : 기본 아이디어에 다시 한 번 감사드립니다. 위험 요소를 잔액이 아닌 여유 마진에 연결하는 것은 분명히 의미가 있습니다.
 

다음 코드는 mql 5의 전문가 파라볼 릭 사에 따라 작성되었습니다. 여기서 매수 신호와 매도 신호의 작동을 반대로 할 수 있습니까? 즉, 매수 신호가 오면 매수 대신 매도를 열기를 원합니다. 누구든지 도와 줄 수 있습니까?




#재산 저작권 "저작권 2022, 메타쿼츠 주식회사"

#속성 링크"https://www.mql5.com"

#속성 버전 "1.00"

//+------------------------------------------------------------------+

//| 포함 |

//+------------------------------------------------------------------+

#include <Expert\Expert.mqh>

//--- 사용 가능한 신호

#include <Expert\Signal\SignalSAR.mqh>

//--- 사용 가능한 후행

#include <Expert\Trailing\TrailingNone.mqh>

//--- 사용 가능한 자금 관리

#include <Expert\Money\Money\MoneyFixedLot.mqh>

//+------------------------------------------------------------------+

//| 입력 |

//+------------------------------------------------------------------+

//--- 전문가 입력

입력 문자열 Expert_Title ="sar"; // 문서 이름

ulong Expert_MagicNumber =13831; //

bool Expert_EveryTick =false; //

//--- 메인 신호에 대한 입력

입력 int Signal_ThresholdOpen =10; // 오픈할 신호 임계값 [0...100]

입력 int Signal_ThresholdClose =10; // 닫을 신호 임계값 [0...100]

input double Signal_PriceLevel =0.0; // 거래를 체결할 가격 수준

input int Signal_Expiration =4; // 지정가 주문의 만기 (바 단위)

input double Signal_SAR_Step =0.02; // 파라볼릭 SAR(0.02,0.2) 속도 증분

input double Signal_SAR_Maximum =0.2; // 파라볼 릭 SAR(0.02,0.2) 최대 속도

input double Signal_SAR_Weight =1.0; // 포물선형 SAR(0.02,0.2) 무게 [0....1.0]

//--- 돈에 대한 입력

input double Money_FixLot_Percent =10.0; // 퍼센트

input double Money_FixLot_Lots =0.1; // 고정량

//+------------------------------------------------------------------+

//| 글로벌 전문가 객체 |

//+------------------------------------------------------------------+

익스퍼트 익스퍼트

//+------------------------------------------------------------------+

//| 전문가 초기화 함수 | //|

//+------------------------------------------------------------------+

int OnInit()

{

//--- 전문가 초기화 중

if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))

{

//----- 실패

printf(__FUNCTION__+": 전문가를 초기화하는 중 오류 발생");

ExtExpert.Deinit();

return(INIT_FAILED);

}

//--- 신호 생성

CExpertSignal *signal=새 CExpertSignal;

if(signal==NULL)

{

//----- 실패

printf(__FUNCTION__+": 신호 생성 오류");

ExtExpert.Deinit();

return(INIT_FAILED);

}

//---

ExtExpert.InitSignal(signal);

signal.ThresholdOpen(Signal_ThresholdOpen);

signal.ThresholdClose(Signal_ThresholdClose);

signal.PriceLevel(Signal_PriceLevel);

signal.Expiration(Signal_Expiration);

//--- CSignalSAR 필터 만들기

CSignalSAR *필터0=새 CSignalSAR;

if(filter0==NULL)

{

//----- 실패

printf(__FUNCTION__+": filter0 생성 중 오류 발생");

ExtExpert.Deinit();

return(INIT_FAILED);

}

signal.AddFilter(filter0);

//--- 필터 매개변수 설정

filter0.Step(Signal_SAR_Step);

filter0.Maximum(Signal_SAR_Maximum);

filter0.Weight(Signal_SAR_Weight);

//--- 트레일링 오브젝트 생성

CTrailingNone *trailing=새 CTrailingNone;

if(trailing==NULL)

{

//----- 실패

printf(__FUNCTION__+": 트레일링 생성 오류");

ExtExpert.Deinit();

return(INIT_FAILED);

}

//--- 전문가에 후행 추가(자동으로 삭제됨))

if(!ExtExpert.InitTrailing(trailing))

{

//----- 실패

printf(__FUNCTION__+": 트레일링 초기화 중 오류 발생");

ExtExpert.Deinit();

return(INIT_FAILED);

}

//--- 후행 매개변수 설정

//--- 화폐 객체 생성

CMoneyFixedLot *money=new CMoneyFixedLot;

if(money==NULL)

{

//----- 실패

printf(__FUNCTION__+": 화폐 생성 오류");

ExtExpert.Deinit();

return(INIT_FAILED);

}

//--- 전문가에 머니 추가(자동으로 삭제됨))

if(!ExtExpert.InitMoney(money))

{

//----- 실패

printf(__FUNCTION__+": money 초기화 오류");

ExtExpert.Deinit();

return(INIT_FAILED);

}

//--- 화폐 매개변수 설정

돈.퍼센트(돈_픽스롯_퍼센트);

money.Lots(Money_FixLot_Lots);

//--- 모든 트레이딩 객체 파라미터 확인

if(!ExtExpert.ValidationSettings())

{

//----- 실패

ExtExpert.Deinit();

return(INIT_FAILED);

}

//--- 필요한 모든 지표 조정

if(!ExtExpert.InitIndicators())

{

//----- 실패

printf(__FUNCTION__+": 인디케이터 초기화 중 오류 발생");

ExtExpert.Deinit();

return(INIT_FAILED);

}

//--- ok

return(INIT_SUCCEED);

}

//+------------------------------------------------------------------+

//| 전문가의 초기화 함수 ||

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

{

ExtExpert.Deinit();

}

//+------------------------------------------------------------------+

//| "Tick" 이벤트 핸들러 함수 ||

//+------------------------------------------------------------------+

void OnTick()

{

ExtExpert.OnTick();

}

//+------------------------------------------------------------------+

//| "거래" 이벤트 핸들러 함수 ||

//+------------------------------------------------------------------+

void OnTrade()

{

ExtExpert.OnTrade();

}

//+------------------------------------------------------------------+

//| "타이머" 이벤트 핸들러 함수 ||

//+------------------------------------------------------------------+

void OnTimer()

{

ExtExpert.OnTimer();

}

//+------------------------------------------------------------------+


 
흥미로운 제안입니다, 한번 살펴 보겠습니다. 오더캘크프로핏() 함수는 MT5에만 존재하며 로트 계산에 대한 아이디어는 MT4 시절로 거슬러 올라갑니다...
 
앱에서 세션을 열어 잔액을 확인할 수 없습니다.
 

이제 해결책을 찾을 시간이 생겼습니다. 그것은 더 정확하고 (다른 하나는 커미션이 고려되므로 더 신중합니까?) MQ의 데모 계정에서 금과은에서 볼 수 있듯이 오류 발생 가능성이 적습니다 - Roboforex를 사용하면 예상대로 귀하의 솔루션보다 다소 신중합니다:

MetaQuotes demo account (b. 3369 Beta channel)
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   XAUUSD  in: 1717.65000 sl:1717.15000  diff:0.50000  delta:10.00000  delta:*diff:5.00000  tVal:0.10000  tSz:0.01000
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   XAGUSD  in: 18.45100 sl:18.40100  diff:0.05000  delta:500.00000  delta:*diff:25.00000  tVal:0.50000  tSz:0.00100
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   EURUSD  in: 1.02185 sl:1.02235  diff:0.00050  delta:97861.72139  delta:*diff:48.93086  tVal:0.97862  tSz:0.00001
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 9983.40 EUR:  XAUUSD  BU  in: 1717.65000  sl: 1717.15000  lotsC: 71.3100 (-3489.26)  lotsB: 10.2000 (-499.09)
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 9983.40 EUR:  XAGUSD  BU  in: 18.45100  sl: 18.40100  lotsC: 18.4900 (-4523.66)  lotsB: 2.0400 (-499.09)
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 9983.40 EUR:  EURUSD  SE  in: 1.02185  sl: 1.02235  lotsC: 9.8000 (-479.29)  lotsB: 10.2100 (-499.34)


RoboForex Demo account (b. 3320 release channel)
2022.07.25 17:46:22.772 test_MM-functions (EURUSD,D1)   XAUUSD  in: 1717.10000 sl:1717.15000  diff:0.05000  delta:100.00000  delta:*diff:5.00000  tVal:0.10000  tSz:0.00100
2022.07.25 17:46:22.772 test_MM-functions (EURUSD,D1)   XAGUSD  in: 18.43400 sl:18.43350  diff:0.00050  delta:5000.00000  delta:*diff:2.50000  tVal:0.05000  tSz:0.00001
2022.07.25 17:46:22.772 test_MM-functions (EURUSD,D1)   EURUSD  in: 1.02186 sl:1.02236  diff:0.00050  delta:100000.00000  delta:*diff:50.00000  tVal:1.00000  tSz:0.00001
2022.07.25 17:46:22.773 test_MM-functions (EURUSD,D1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 5348.69 USD:  XAUUSD  SE  in: 1717.10000  sl: 1717.15000  lotsC: 38.2000 (-191.00)  lotsB: 53.4900 (-267.45)
2022.07.25 17:46:22.773 test_MM-functions (EURUSD,D1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 5348.69 USD:  XAGUSD  BU  in: 18.43400  sl: 18.43350  lotsC: 59.4300 (-148.57)  lotsB: 106.9700 (-267.42)
2022.07.25 17:46:22.773 test_MM-functions (EURUSD,D1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 5348.69 USD:  EURUSD  SE  in: 1.02186  sl: 1.02236  lotsC: 5.1400 (-257.00)  lotsB: 5.3500 (-267.50)

MQ 계정에서는 로트 크기가 너무 높습니다.

다음은 두 가지 방법을 비교하기 위한 제 스크립트입니다:

//+------------------------------------------------------------------+
//|                                            test_MM-functions.mq5 |
//|                                                            Calli |
//|                              https://www.mql5.com/de/users/gooly |
//+------------------------------------------------------------------+
#property copyright "Calli"
#property link      "https://www.mql5.com/de/users/gooly"
#property version   "1.00"
#property script_show_inputs
//--- input parameters
input double   risk_perCent   = 5.0;   // risk of capital in % on free_margin
input double   diff_sl        = 50;    // diff sl in points from entry
input double   CommPerLot     = 2.00;  

string Com = "",Syms[] = {"XAUUSD", "XAGUSD", "EURUSD" }; //,"AUDUSD","GBPCHF","GBPUSD", "EURCAD", "USDCAD", "USDRUB", "GBPJPY", "USDJPY"};

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
#define  forEach(TYPE, VAR, ARRAY) \
                TYPE VAR=NULL; \
                for(int i##VAR=0;  i##VAR<ArraySize(ARRAY)&&((VAR=ARRAY[i##VAR])!=NULL||true);  i##VAR++)

void OnStart()
  {
//---
   MqlTick mqTick;
   forEach(string, sym, Syms){
      
      double pnt = SymbolInfoDouble(sym,SYMBOL_POINT);
      ENUM_ORDER_TYPE ord = GetMicrosecondCount()%2==0 ? ORDER_TYPE_BUY : ORDER_TYPE_SELL; // randomly buy or sell
      SymbolInfoTick(sym,mqTick); 
      double entry = (ord==ORDER_TYPE_BUY) ? mqTick.ask : mqTick.bid,
             sl    = (ord==ORDER_TYPE_BUY) ? entry - diff_sl*pnt : entry + diff_sl*pnt,
             lossC = 0.0, lossB = 0.0,
             lotsC = lotszC(risk_perCent, entry, sl, sym, CommPerLot), 
             lotsB = lotszB(risk_perCent, entry, sl, sym, CommPerLot);
      
      if (!OrderCalcProfit(ord, sym, lotsC, entry, sl, lossC) ) 
         Print("chk OrderCalcProfit(",EnumToString(ord),", ",sym,", lot: ",lotsC,", in: ",DoubleToString(entry,6),", out: ",DoubleToString(sl,6),", lossC) => err: ",_LastError," lossC: ",lossC);
             
      if (!OrderCalcProfit(ord, sym, lotsB, entry, sl, lossB) ) 
         Print("chk OrderCalcProfit(",EnumToString(ord),", ",sym,", lot: ",lotsC,", in: ",DoubleToString(entry,6),", out: ",DoubleToString(sl,6),", lossC) => err: ",_LastError," lossC: ",lossC);
             
      string res = StringFormat("Set: Risk: %.1f %%, dSL: %.0f  Com/Lot: %.2f  Free: %.2f %s:  %s  %s  in: %.5f  sl: %.5f  lotsC: %.4f (%+.2f)  lotsB: %.4f (%+.2f)",
                                 risk_perCent, diff_sl, CommPerLot,
                                 AccountInfoDouble(ACCOUNT_MARGIN_FREE),AccountInfoString(ACCOUNT_CURRENCY),
                                 sym, (ord==ORDER_TYPE_BUY ? "BU" : "SE"), entry, sl, lotsC, lossC, lotsB, lossB );
      Com = Com + res+"\n";
   }
   Comment(Com);
   //Print(Com);
  }
//+------------------------------------------------------------------+
double lotszC (double risk, double entry, double sl, string sym="", double CommissionPerLot=0) {
   if (sym == "") sym = _Symbol;
   double deltaValue = SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_VALUE) / SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_SIZE);
   ENUM_ORDER_TYPE ordDir = entry > sl ? ORDER_TYPE_BUY : ORDER_TYPE_SELL;
   double diff = fabs (entry - sl); 
   Print(sym,"  in: ",DoubleToString(entry,5)," sl:",DoubleToString(sl,5),"  diff:",DoubleToString(diff,5),
         "  delta:",DoubleToString(deltaValue,5),"  delta:*diff:",DoubleToString(deltaValue*diff,5),
         "  tVal:",DoubleToString(SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_VALUE),5),"  tSz:",
         DoubleToString(SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_SIZE),5));
   double lts = ( (AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk/100) / (diff * deltaValue + CommissionPerLot) );
   lts = ( fmin(fmax(SymbolInfoDouble(sym,SYMBOL_VOLUME_MIN),lts),SymbolInfoDouble(sym,SYMBOL_VOLUME_MAX)));
   double stepSize = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP);
   return (MathRound(lts/stepSize)*stepSize);
}

double lotszB (double risk, double entry, double sl, string sym="", double CommissionPerLot=0) {
   if (sym == "") sym = _Symbol;
   ENUM_ORDER_TYPE ordDir = entry > sl ? ORDER_TYPE_BUY : ORDER_TYPE_SELL;
   double loss;
   if (!OrderCalcProfit(ordDir, sym, 1, entry, sl, loss)) return(-1.0);
   double lts = ((AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk * 0.01) / -loss);
   lts = (fmin(fmax(SymbolInfoDouble(sym, SYMBOL_VOLUME_MIN), lts), SymbolInfoDouble(sym, SYMBOL_VOLUME_MAX)));
   double stepSize = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP);
   return (MathRound(lts / stepSize) * stepSize);
}

저는 > sl(매수) 또는 < sl(매도)에서 방향을 도출했습니다. 그러면 보류 중인 주문에 문제가 없을 것입니다.

[삭제]  

테스트해 주셔서 감사합니다. 예, 결과를 서로 비교하면 주문 계산 수익의 일관성과 다른 한편으로는 적어도 EURUSD 및 RoboForex의 경우 결과가 대략 "로트 크기 * 로트당 수수료"만큼 다르다는 것을 알 수 있습니다. 이를 추가할 수 있습니다:

if (!OrderCalcProfit(ordDir, sym, 1, entry, sl, loss)) return(-1.0);
double lts = ((AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk * 0.01) / (-loss + CommissionPerLot);
포럼 검색을 올바르게 사용했다면 MQL5를 사용하여 "로트당 커미션" 값을 직접 쿼리할 수 있는 방법이 없나요?
 
Benjamin Fotteler #:


포럼 검색을 올바르게 사용했다면 MQL5를 사용하여 "로트당 커미션" 값을 직접 쿼리할 수 있는 방법이 없나요?

예, 터미널에서 직접 조회하는 것이 아니라 브로커 또는 거래내역: DEAL_COMMISSION에서 요청해야 합니다.

Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Handelskonstanten / Eigenschaften der Deals
Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Handelskonstanten / Eigenschaften der Deals
  • www.mql5.com
Eigenschaften der Deals - Handelskonstanten - Konstanten, Enumerationen und Strukturen - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5