5자리 감지

 
double pointsPerPip(){
   string suffix = StringSubstr ( Symbol (), 6 );
   int digits = MarketInfo( "EURUSD" + suffix, MODE_DIGITS);
   if (digits == 0 ){
      digits = MarketInfo( "EURUSD" , MODE_DIGITS);
   }
   if (digits == 0 ){
       return ( 1 );
   } else {
       if (digits == 5 ){
         return ( 10 );
      }
   }
   return ( 1 );
}
저는 현재 pip 승수로 1 또는 10이 필요한지 여부를 감지하는 가장 확실한 방법을 찾으려고 노력하고 있습니다. 위의 것은 EURUSD가 몇 자릿수를 가지고 있는지 단순히 보는 첫 번째 아이디어였습니다. 이 기호가 EURUSDm 또는 EURUSDiam이라고 하는 중개인이 있거나 중개인이 코드를 깨는 것 외에 다른 이유 없이 추가한 재미있는 말도 안되는 소리가 있으며 예를 들어 GOLD 또는 GOLDm과 같이 정확히 6자가 없는 기호 이름도 있습니다. 위의 처리할 수 없습니다.

정확한 숫자를 찾는 더 정교한 알고리즘이 있는 사람이 있습니까? EURUSD의 기호 이름이 얼마나 정확한지 먼저 찾고 나머지는 쉽게 찾는 문제로 귀결된다고 생각합니다. 예를 들어 "EURUSD"를 포함하거나 시작하는 이름을 검색할 수 있도록 사용 가능한 모든 기호를 열거하는 쉬운 방법이 있습니까?
 

일반적으로 초기화 섹션에서 한 번만 확인 합니다.

 int mypoint;
int init()
{
if (MarketInfo( Symbol (), MODE_DIGITS)== 3 ||MarketInfo( Symbol (), MODE_DIGITS)== 5 )
mypoint= 10 ;
else mypoint= 1 ;
}
...
 
Roger :

일반적으로 초기화 섹션에서 한 번만 확인합니다.

귀하의 코드는 완전하지 않습니다. 1 또는 2(금색) 또는 기타 숫자의 기호가 있습니다.

더 나은 방법을 찾았습니다(여전히 더 많은 브로커와 테스트해야 함). 히스토리 폴더의 symbol.raw를 읽어 eurusd의 이름을 찾은 다음 MarketInfo()를 사용합니다.

 /**
* determine the pip multiplier (1 or 10) depending on how many
* digits the EURUSD symbol has. This is done by first
* finding the exact name of this symbol in the symbols.raw
* file (it could be EURUSDm or EURUSDiam or any other stupid name
* the broker comes up with only to break other people's code) 
* and then usig MarketInfo() for determining the digits.
*/
double pointsPerPip(){
   int i;
   int digits;
   double ppp = 1 ;
   string symbol;
   int f = FileOpenHistory( "symbols.raw" , FILE_BIN | FILE_READ );
   int count = FileSize (f) / 1936 ;
   for (i= 0 ; i<count; i++){ 
      symbol = FileReadString (f, 12 );
       if ( StringFind (symbol, "EURUSD" ) != - 1 ){
         digits = MarketInfo(symbol, MODE_DIGITS);
         if (digits == 4 ){
            ppp = 1 ;
         } else {
            ppp = 10 ;
         }
         break ;
      }
       FileSeek (f, 1924 , SEEK_CUR );
   }
   FileClose (f);
   return (ppp);
}
 

하나의 통화에만 해당하는 코드였습니다. 다중 통화에 EA를 사용하려면 각 경우에 대해 별도로 계산해야 합니다.

 
7bit :
더 나은 방법을 찾았습니다(여전히 더 많은 브로커와 테스트해야 함). 히스토리 폴더의 symbol.raw를 읽어 eurusd의 이름을 찾은 다음 MarketInfo()를 사용합니다.

이것은 그들이 symbol.raw 파일을 변경하면 중단될 것입니다(그리고 MT4의 이전 버전에서는 작동하지 않을 수 있습니다... 아마도 문제가 되지는 않겠지만).

 
나는 Roger와 같은 방법을 사용하며 아직 문제를 일으키지 않았습니다.
대부분의 경우에 작동합니다. 미래에 맞지 않는 다리를 찾으면 발견했을 때 그 다리를 건너십시오.

CB
 
//++++ These are adjusted for 5 digit brokers.
double  pips2points,    // slippage  3 pips    3=points    30=points
        pips2dbl;       // Stoploss 15 pips    0.0015      0.00150
int     Digits.pips;    // DoubleToStr(dbl/pips2dbl, Digits.pips)
int init() {
    if (Digits == 5 || Digits == 3) {   // Adjust for five (5) digit brokers.
                pips2dbl    = Point*10; pips2points = 10;   Digits.pips = 1;
    } else {    pips2dbl    = Point;    pips2points =  1;   Digits.pips = 0; }
 
WHRoeder :
 if ( Digits == 5 || Digits == 3 ) {   // Adjust for five (5) digit brokers.

당신은 내가 이미 충분하다고 생각한 것과 똑같은 것을 반복하고 있습니다. Digits 변수만 사용하는 것은 현재 실행 중인 기호와 이 기호가 가져야 하는 자릿수를 고려하지 않기 때문에 문제(첫 번째 게시물에서 문제가 정의됨)에 도움이 되지 않습니다. 5 또는 3 대 4 또는 2뿐만 아니라 일부 이국적인 쌍에는 0에서 5까지의 숫자가 있을 수 있습니다. 그렇게 간단했다면 이 스레드를 열지 않았을 것입니다. 따라서 나는 지금 어떤 쌍을 실행하든 상관없이 eurusd의 숫자를 사용하고 있습니다. eurusd의 실제 이름을 찾는 것이 가장 큰 문제였는데 지금까지는 symbol.raw 메서드가 가장 간단하고 신뢰할 수 있는 방법인 것 같습니다.
 
cloudbreaker :
미래에 맞지 않는 다리를 찾으면 발견했을 때 그 다리를 건너십시오.

깨지지 않는 완벽한 코드를 작성하려고 합니다. (고의적으로) 버그가 있는 코드를 작성하고 수정하기 전에 중단될 때까지 기다리는 것은 소프트웨어 개발 방식에 대한 내 철학에 맞지 않습니다.
 
7bit wrote >>
깨지지 않는 완벽한 코드를 작성하려고 합니다. (고의적으로) 버그가 있는 코드를 작성하고 수정하기 전에 중단될 때까지 기다리는 것은 소프트웨어 개발 방식에 대한 내 철학에 맞지 않습니다.


위의 코드가 '버그'라고 말하지는 않겠습니다. 사용자가 잘 알고 있는.. 제한 사항이 있을 뿐입니다.
철학의 아름다움은 실용성과 비동기적으로 실행할 수 있다는 것입니다 :)
-BB-
 
주어진 가격과 관련하여 한 점이 무엇인지 알아낸 다음 가격의 자릿수와 비교하여 어느 자릿수인지 결정하는 것은 단순한 문제가 아닙니까?
이를 달성하는 간단한 방법은 가격을 추가하고 결과가 동일하지 않은 경우 승수 + 동일한 가격과 비교할 수 있습니다. 일치할 때까지 루프에서 승수를 증가시킵니다.