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

 
Andrey F. Zelinsky :
여기에 약간의 정보가 있습니다 https://docs.mql4.com/en/convert/normalizedouble

DoubleToString IMHO...

인쇄.

 
Andrey F. Zelinsky :
여기에 약간의 정보가 있습니다 https://docs.mql4.com/en/convert/normalizedouble
당신은 그것을 믿지 않을 것입니다. 처음에는 모든 데이터가 정규화되었으며 쉼표 뒤에 숫자가 있었습니다. 이중 값이라도 정규화해야 한다는 것을 알고 있습니다. 정규화 된 정적 데이터를 직접 다시 계산해보십시오. 이것은 컴파일러 오류라고 생각하지만 내가 틀렸기를 바랍니다. 지금까지는 MathRound 함수로이 문제를 해결했지만 이것은 옳지 않습니다!
 
arhipov-76 :
믿기지 않을 것입니다. 처음에는 모든 데이터가 정상화되었으며 쉼표 뒤에 숫자 가 있었습니다. 이중 값이라도 정규화해야 한다는 것을 알고 있습니다. 정규화 된 정적 데이터를 직접 다시 계산해보십시오. 이것은 컴파일러 오류라고 생각하지만 내가 틀렸기를 바랍니다. 지금까지는 MathRound 함수로이 문제를 해결했지만 이것은 옳지 않습니다!

digis가 무엇인지 모르지만 DoubleToString (...) 함수를 사용해 보세요.

현재 EA 내부에서 고려하는 것을 사용하여 계산을 수행하면 NormalizeDouble() 을 사용해도 계산이 올바르게 수행되지만 Print, Alert, Comment와 같은 매개변수를 외부에 표시하려면 DoubleToString 을 통한 정규화를 사용하십시오. (... )

DoubleToString - Преобразование данных - Справочник MQL4
DoubleToString - Преобразование данных - Справочник MQL4
  • docs.mql4.com
DoubleToString - Преобразование данных - Справочник MQL4
 

숫자 0.0001을 어떻게 정규화 하든 이진 표현에서는 무한 주기 분수로 남아 있습니다. 왜냐하면 5로 나누기 때문입니다. 컴퓨터에서 이 무한 분수는 맞는 길이로 잘라야 합니다. 그것으로 나눈 결과, 우리는 다시 매우 긴 것을 얻습니다. 이것도 잘려야 합니다. 10진수 형식의 결과 숫자의 "좋은" 형식의 경우 프로그램에서 해당 숫자를 적절한 소수 자릿수를 가진 문자열로 변환해야 합니다. 예를 들어 여기에서 이미 언급한 DoubleToString을 사용합니다.

추신 "결과는 예상보다 1/10이 적습니다." - 그러한 비난은 없었습니다. 1억분의 1은...

 
Timur1988 :

안녕하세요! 알고리즘을 도와주세요!
Pearson 상관 계수를 계산하는 간단한 스크립트를 작성했습니다. 첫 번째 막대에서 시작하여 종가 로 선택된 배열

가격 배열은 첫 번째 막대부터 시작하여 24개 막대로 끝나는 값을 가져옵니다.
이제 24개 막대에 대한 상관 관계도 계산하고 싶지만 SECOND(!) 막대에서 가격 배열을 가져옵니다.

알고리즘을 모르는 상태에서 각 가격 배열을 수동으로 입력했습니다.

24개의 막대는 너무 많고 100개의 막대에 대한 상관관계를 알고 싶다면 각 배열을 입력하는 것이 괴롭습니다.
사람들은 어떻습니까?)

아마도 Koef=Edxdy/( sqrt ( DoubleToString ((Edx2*Edy2), w)));

 
Vladimir :

아마도 Koef=Edxdy/( sqrt ( DoubleToString ((Edx2*Edy2), w)));

다음은 상관 관계를 계산하기 위한 작동 함수입니다. 배열에 가격만 제공하면 됩니다. 출력은 값이 됩니다.

string Correlation1( double & CurOpen[], double & SubOpen[]) {
double sumXY2= 0 , sumX2= 0 , sumY2= 0 , sumXs2= 0 , sumYs2= 0 , res2= 1 ;

int k= MathMin ( ArraySize (CurOpen), ArraySize (SubOpen));
   if (k> 2 ) {
   for ( int i= 0 ; i<k; i++) {
     sumXY2+=CurOpen[i]*SubOpen[i];
     sumX2 +=CurOpen[i];
     sumY2 +=SubOpen[i];
     sumXs2+=CurOpen[i]*CurOpen[i];
     sumYs2+=SubOpen[i]*SubOpen[i];    
    }
   res2 = (k*sumXY2-sumX2*sumY2) / MathSqrt ( (k*sumXs2-sumX2*sumX2)*(k*sumYs2-sumY2*sumY2) );
  }
   return ( DoubleToStr (res2, 2 ));
}
 
안녕하세요! 로봇을 데모 계정 에 넣었습니다. 두 번째 달에는 작동합니다. 오늘 나는 터미널을 열었습니다. 비록 그 전에 하나의 주문이 이루어졌지만 하나의 신호에 두 개의 주문이 들어왔습니다. 주문 수에 제한이 있습니다. 이유는 무엇입니까?
 

여기 내가 사용하는 것이 있습니다

Вот что я использую

if (ExistPositions(Symb)== false &&ExistOrders(Symb)== false &&Delta_Buy< Low [ 1 ]&& sar> Close [ 1 ])
{SetOrder( NULL , OP_BUYSTOP ,Lts,sar,sar-SL* Point (),sar+TP* Point (),Magik_number);}
if (ExistPositions(Symb)== false &&ExistOrders(Symb)== false &&Delta_Sell> High [ 1 ] && sar< Close [ 1 ])
{SetOrder( NULL , OP_SELLSTOP ,Lts,sar,sar+SL* Point (),sar-TP* Point (),Magik_number);}


//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.03.2008                                                     |
//|  Описание : Возвращает флаг существования ордеров.                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время установки)          |
//+----------------------------------------------------------------------------+
bool ExistOrders( string sy= "" , int op=- 1 , int mn=- 1 , datetime ot= 0 ) {
   int i, k= OrdersTotal (), ty;

   if (sy== "0" ) sy= Symbol ();
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) {
      ty= OrderType ();
       if (ty> 1 && ty< 6 ) {
         if (( OrderSymbol ()==sy || sy== "" ) && (op< 0 || ty==op)) {
           if (mn< 0 || OrderMagicNumber ()==mn) {
             if (ot<= OrderOpenTime ()) return ( True );
          }
        }
      }
    }
  }
   return ( False );
}
//--------------------------------------------------------------------------------//


bool ExistPositions( string sy= "" , int op=- 1 , datetime ot= 0 ) {
   int i, k= OrdersTotal ();

   if (sy== "0" ) sy=Symb;
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) {
       if ( OrderSymbol ()==sy || sy== "" ) {
         if ( OrderType ()== OP_BUY || OrderType ()== OP_SELL ) {
           if (op< 0 || OrderType ()==op) {
             if ( OrderMagicNumber ()==Magik_number) {
               if (ot<= OrderOpenTime ()) return ( True );
            }
          }
        }
      }
    }
  }
   return ( False );
}
 
Neron_76 :

여기 내가 사용하는 것이 있습니다

주기는 OrdersTotal () -1에서 0까지 역순으로 계산해야 합니다.
 
Vitalie Postolache :
주기는 OrdersTotal () -1에서 0까지 역순으로 계산해야 합니다.
감사합니다. 다시 하겠습니다.