초보자의 질문 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
사유: