MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 565

 
PolarSeaman :

당신은 당신의 코드에서 대체했습니다

그러나 도움이되지 않았습니다)

이것만 알아차려서 죄송합니다.

 
Alekseu Fedotov :

SEEK_END 플래그가 있는 FileSeek()가 도움이 될 것입니다.

<

감사합니다! 시도하겠습니다!

 
YanSay :

좋은 저녁이에요!

나는 보증금의 %를 기반으로 거래의 로트를 계산하기 위해 범용(다양한 도구에 대해) 코드를 추가하는 방법에 대해 머리를 쓰고 있습니다.

다음과 같이 했습니다.

가격( 포지션 시가 )과 SL(손절매)은 별도로 계산되며 여기에 추가하지 않았습니다.

견적 통화가 달러로 표시되는 쌍(예: EURUSD), SPX500 지수 및 금의 경우 - 모든 것이 올바르게 계산되지만 달러가 견적에서 첫 번째인 쌍(예: USDJPY)의 경우 작동하지 않습니다.

무엇을 놓쳤는지 말해주세요?

정규화에 주의

_Digits 변수는 현재 차트 기호 가격 측정의 정확도를 결정하는 소수점 이하 소수점 이하 자릿수를 저장합니다.

 
Alekseu Fedotov :

정규화에 주의

_Digits 변수는 현재 차트 기호 가격 측정의 정확도를 결정하는 소수점 이하 소수점 이하 자릿수를 저장합니다.

덕분에! 다음과 같이 변경했습니다.

 input double MaximumRisk= 0.02 ;                   //Риск в сделке от депозита

//1ый вариант
{Lots = NormalizeDouble ((( AccountBalance ()*MaximumRisk)/(( MathAbs (Price-SL))/ Point )/(( MarketInfo ( Symbol (), MODE_LOTSIZE )*( MarketInfo ( Symbol (), MODE_ASK )+ Point ))
-( MarketInfo ( Symbol (), MODE_LOTSIZE )* MarketInfo ( Symbol (), MODE_ASK )))),
int ( MathAbs ( log ( MarketInfo ( Symbol (), MODE_LOTSTEP )))));}

//2ой вариант
{Lots = NormalizeDouble (( AccountBalance ()*MaximumRisk)/(( MathAbs (Price-SL))/ Point )/(( MarketInfo ( Symbol (), MODE_TICKVALUE ))),
int ( MathAbs ( log ( MarketInfo ( Symbol (), MODE_LOTSTEP )))));}

첫 번째 옵션: EURUSD 및 XAUUSD - 모든 것이 정확합니다. USDJPY - 보증금의 2% 대신 보증금의 0.2% 위험을 감수합니다. SPX500 및 BRN의 경우 OrderSend 오류 131(로트 계산 오류)이 발생합니다.

두 번째 옵션: EURUSD, XAUUSD 및 USDJPY - 모든 것이 정확합니다. SPX500 - 보증금의 2% 대신 보증금의 20% 위험을 감수합니다. BRN의 경우 OrderSend 오류 131(로트 계산 오류)이 발생합니다.

다른 곳에 오류가 있습니다. 어느 부분에서 이해할 수 없는지 알려주세요.

 
YanSay :

덕분에! 다음과 같이 변경했습니다.

첫 번째 옵션: EURUSD 및 XAUUSD - 모든 것이 정확합니다. USDJPY - 보증금의 2% 대신 보증금의 0.2% 위험을 감수합니다. SPX500 및 BRN의 경우 OrderSend 오류 131(로트 계산 오류)이 발생합니다.

두 번째 옵션: EURUSD, XAUUSD 및 USDJPY - 모든 것이 정확합니다. SPX500 - 보증금의 2% 대신 보증금의 20% 위험을 감수합니다. BRN의 경우 일반적으로 OrderSend 오류 131(로트 계산 오류)을 제공합니다.

다른 곳에 오류가 있습니다. 어느 부분에서 이해할 수 없는지 알려주세요.

Point MarketInfo 로 교체 ( 심볼 (), MODE_POINT )

 
Vitaly Muzichenko :

Point MarketInfo 로 교체 ( 심볼 (), MODE_POINT )

의미는 어떻습니까? 차트 기호의 모든 항목이 계산되는 경우. 다중 통화 및 계산된 기호 가 현재 차트와 다른 경우 의미가 있습니다.

 
Vitaly Muzichenko :

Point MarketInfo 로 교체 ( 심볼 (), MODE_POINT )

불행히도 그것은 도움이되지 않았습니다

그리고 MODE_POINT에 대한 정보에는 "견적 통화의 포인트 크기입니다. 현재 상품의 경우 사전 정의된 변수 Point에 저장됩니다."

설명으로 판단하면 어떤 옵션을 사용해도 상관 없습니다. 하지만 시도했지만 작동하지 않았습니다.


 

말해봐, Expert Advisor의 버튼에 그래픽 도구의 "선택"을 두어 커서 아래에 있는 버튼을 클릭하면 도구 아이콘이 나타나고 끌어올 수 있습니까?

또한 지정된 속성이 이미 있는 채널이

 
Roman Sharanov :

말해봐, Expert Advisor의 버튼에 그래픽 도구의 "선택"을 두어 커서 아래에 있는 버튼을 클릭하면 도구 아이콘이 나타나고 끌어올 수 있습니까?

또한 지정된 속성을 가진 채널이

아마도

 
YanSay :

불행히도 도움이되지 않았습니다

그리고 MODE_POINT에 대한 정보에는 "견적 통화의 포인트 크기입니다. 현재 상품의 경우 사전 정의된 변수 Point에 저장됩니다."

설명으로 판단하면 어떤 옵션을 사용해도 상관 없습니다. 하지만 시도했지만 작동하지 않았습니다.

다음 기능을 사용해 보세요.

 //===============================================================================================
//------------------------------ Расчет лота по риску на StopLoss -------------------------------+
//===============================================================================================
double sLot( double Percent= 1 , double Stloss= 100 , string symb= "0" ) {
 if (symb== "0" ) symb= Symbol ();
 double TickValue   = SymbolInfoDouble (symb, SYMBOL_TRADE_TICK_VALUE ),
        TickSize    = SymbolInfoDouble (symb, SYMBOL_TRADE_TICK_SIZE ),
        ContractSize= SymbolInfoDouble (symb, SYMBOL_TRADE_CONTRACT_SIZE ),
        Min_Lot     = SymbolInfoDouble (symb, SYMBOL_VOLUME_MIN ),
        Max_Lot     = SymbolInfoDouble (symb, SYMBOL_VOLUME_MAX ),
        Step        = SymbolInfoDouble (symb, SYMBOL_VOLUME_STEP ),
        Free        = AccountInfoDouble ( ACCOUNT_FREEMARGIN ),
        Lots_New    = 0.0 ;
 int CalcMode=( int ) SymbolInfoInteger (symb, SYMBOL_TRADE_CALC_MODE );

   if (Percent > 100 ) Percent = 100 ;
   if (Stloss <= 0 ) return ( 0 );
   if (Percent == 0 ) Lots_New = Min_Lot;
   else {
     if (CalcMode== 0 || CalcMode== 4 )
      Lots_New = MathFloor ((((Free*Percent/ 100 )/Stloss)/TickValue)/Step)*Step;
     if (CalcMode== 1 ||CalcMode== 2 ||CalcMode== 3 )
      Lots_New = MathFloor (((((Free*Percent)/ 100 )/Stloss)/((TickSize*TickValue)*ContractSize/TickValue))/Step)*Step;
   }
   if (Lots_New > Max_Lot) Lots_New = Max_Lot;
   if (Lots_New < Min_Lot) return ( 0 );
   return ( NormalizeDouble (Lots_New, /*LotDigit()*/ 2 ));
 }