포럼을 어지럽히 지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 6. - 페이지 739

 
korobok777:
Lot=NormalizeDouble(Balance*0.001,2);
 
Vinin :
당신이 쓰지 않은 것

네 오타 수정했습니다. 아니면 원칙이 잘못된 것인가? 요점은 잔액이 나머지 없이 10으로 나눌 수 있는 경우 잔액의 1/10만큼 초기 로트의 곱으로 로트를 취한다는 것입니다. 이 방법이 아니라? 그리고 어떻게?


Vadim이 여기에 더 쉽게 썼지만, 예)))

 
evillive :

네 오타 수정했습니다. 아니면 원칙이 잘못된 것인가? 요점은 잔액이 나머지 없이 10으로 나눌 수 있는 경우 잔액의 1/10만큼 초기 로트의 곱으로 로트를 취한다는 것입니다. 이 방법이 아니라? 그리고 어떻게?


Vadim이 여기에 더 쉽게 썼지만, 예)))

잔액을 나머지 없이 10으로 나누는 경우는 매우 드뭅니다. 다른 경우(대부분의 경우)에는 기본 로트가 있습니다.
 
evillive :
double StartLot= 0.01 ;
if ( MathMod (AccountBalance(), 10 )== 0 ) Lot=StartLot*AccountBalance()/ 10 ;

MarketInfo()는 어떻습니까?

MODE_MINLOT, MODE_MAXLOT, MODE_LOTSTEP은 어떻습니까?

또한 로트 값의 허용된 자릿수 그리드에 들어가야 합니다.

 #property strict

/******************************************************************************/
double getLot( double factor = 0.001 ) {
   double minLot = MarketInfo( Symbol (), MODE_MINLOT);

   if (minLot > 0 ) { // Проверка значения от функции MetaQuotes на вменяемость
     double maxLot = MarketInfo( Symbol (), MODE_MAXLOT);

     if (maxLot >= minLot) { // Проверка второго значения от функции MetaQuotes на вменяемость
       double lotStep = MarketInfo( Symbol (), MODE_LOTSTEP);

       if (lotStep > 0 ) { // Проверка третьего значения от функции MetaQuotes на вменяемость
         double rawLot = AccountBalance() * factor; // Грубо вычисленное значение лота

         // В процессе "рихтования" грубо вычисленного значения лота подразумевается, что "округление" происходит всегда к меньшему
         if (rawLot >= minLot && rawLot < maxLot + lotStep) { // Если грубо вычисленное значение "влезает" в диапазон разрешённых значений лотов
           int stepNum = int ((rawLot - minLot) / lotStep); // Количество step'ов, которое надо "отступить вправо на числовой оси" от минимального значения лота (при преобразовании double -> int как раз и происходит нужный тип округления)

           return minLot + lotStep * stepNum; // Вычисляем значение лота в "разрядной сетке" разрешённых лотов.
        }
      }
    }
  }

   return 0 ; // Какие-то обстоятельства не позволили выдать значение в "разрядной сетке" разрешённых лотов; для индикации данного события выдаётся специальное значение 0.
}

/******************************************************************************/
void OnStart () {
   Print ( "AccountBalance() = " , AccountBalance(), ", getLot() = " , getLot());
}

쫓겨났고 진실과 비슷한 것을 얻었습니다.

 0        20 : 09 : 49.699     Script 3 EURUSDm,H1: loaded successfully
0        20 : 09 : 49.699      3 EURUSDm,H1: initialized
0        20 : 09 : 49.699      3 EURUSDm,H1: AccountBalance() = 152.82 , getLot() = 0.15
0        20 : 09 : 49.699      3 EURUSDm,H1: uninit reason 0
0        20 : 09 : 49.699     Script 3 EURUSDm,H1: removed

일이 잘못되지 않은 것 같습니다.

 
simpleton :

MarketInfo()는 어떻습니까?

MODE_MINLOT, MODE_MAXLOT, MODE_LOTSTEP은 어떻습니까?

또한 로트 값의 허용된 자릿수 그리드에 들어가야 합니다.

쫓겨났고 진실과 비슷한 것을 얻었습니다.

잘 안 된 것 같습니다.

덕분에 해결했습니다 :D

나 자신을 위해 모든 수표와 함께 글을 쓰는 것이 분명합니다. 균형 / 10 비율을 가져오기 위해 많은 스케치가 있었지만 아이디어는 실패했습니다 ...

하지만 텍스트가 많으면 더 간단할 수 있습니다.

  lotstep= MarketInfo(Symbol(),MODE_LOTSTEP);
  lotmax=MarketInfo(Symbol(), MODE_MAXLOT);
  lotmin=MarketInfo(Symbol(), MODE_MINLOT);

lot=lotstep* MathRound (AccountBalance()* 0.001 /lotstep);
if (lot < lotmin) lot = lotmin;
if (lot > lotmax) lot = lotmax;
 
simpleton :

MarketInfo()는 어떻습니까?

MODE_MINLOT, MODE_MAXLOT, MODE_LOTSTEP은 어떻습니까?

또한 로트 값의 허용된 자릿수 그리드에 들어가야 합니다.

쫓겨났고 진실과 비슷한 것을 얻었습니다.

잘 안 된 것 같습니다.

왜 타고난 프로그래머가 사업을 시작하면 목표를 달성하는 데 필요한 한 줄이 0.5km에 대한 목록으로 바뀌는 이유는 무엇입니까?

 double Lot = NormalizeDouble (AccountBalance()/ 1000 ,2);
if(Lot<Min_Lot)Lot=Min_Lot;
 
_new-rena :

왜 타고난 프로그래머가 사업을 시작하면 목표를 달성하는 데 필요한 한 줄이 0.5km에 대한 목록으로 바뀌는 이유는 무엇입니까?

일부의 경우 로트 단계는 0.01이 아니라 예를 들어 0.03 또는 0.1입니다. 그리고 어떻게? 시간이 많이 걸리지 않기 때문에 모든 경우에 확인이 필요합니다.
 
evillive :
일부의 경우 로트 단계가 0.01이 아니라 0.03입니다. 그리고 어떻게? 시간이 많이 걸리지 않기 때문에 모든 경우에 확인이 필요합니다.
당신은 init에서 (아래)를 설정하고 더 이상 서버와 컴퓨터를 괴롭히지 않습니다
double Min_Lot=MarketInfo( Symbol (), MODE_MINLOT);
 
나는 분(min)이 아니라 단계(step)에 대해 말하는 것입니다. 많이, 하지만 좋아, 가자.
 
_new-rena :

왜 타고난 프로그래머가 사업을 시작하면 목표를 달성하는 데 필요한 한 줄이 0.5km에 대한 목록으로 바뀌나요?

모든 종류의 쓰레기가 매 턴마다 기다리고 있기 때문에 자신을 방어해야합니다. 보호되지 않으면 품질이 매우 낮아 장기적으로 매우 비쌀 수 있습니다. 노력의 90%는 모든 종류의 쓰레기로부터 보호하는 데 사용되며 10%만 문제를 해결하는 데 사용됩니다. MT4 및 MQL4++의 경우 비율이 훨씬 더 비대칭입니다.

문서 를 읽는 동안 쓰레기가 시작됩니다.

Возвращаемое значение

Информация о финансовом инструменте. Часть информации о текущем финансовом инструменте хранится в предопределенных переменных.

모든 것. 금융 상품에 대한 정보만 반환할 의무가 있습니다. 다른 결과는 없습니다. "헛소리" 도구에 대한 정보를 얻습니다.

 #property strict

/******************************************************************************/
void OnStart () {
   Print ( "MarketInfo(\"Фигня\", MODE_MINLOT) = " , MarketInfo( "Фигня" , MODE_MINLOT));
   Print ( "MarketInfo(\"Фигня\", MODE_MAXLOT) = " , MarketInfo( "Фигня" , MODE_MAXLOT));
   Print ( "MarketInfo(\"Фигня\", MODE_LOTSTEP) = " , MarketInfo( "Фигня" , MODE_LOTSTEP));
}

이 도구의 로트 크기 매개변수를 살펴보겠습니다.

 0        21 : 12 : 18.980     Script 3 EURUSDm,H1: loaded successfully
0        21 : 12 : 18.980      3 EURUSDm,H1: initialized
0        21 : 12 : 18.980      3 EURUSDm,H1: MarketInfo( "Фигня" , MODE_MINLOT) = 0.0
0        21 : 12 : 18.980      3 EURUSDm,H1: MarketInfo( "Фигня" , MODE_MAXLOT) = 0.0
0        21 : 12 : 18.980      3 EURUSDm,H1: MarketInfo( "Фигня" , MODE_LOTSTEP) = 0.0
0        21 : 12 : 18.980      3 EURUSDm,H1: uninit reason 0
0        21 : 12 : 18.980     Script 3 EURUSDm,H1: removed

흥미로운 옵션. 문서에 잘못된 상황이 발생한 경우 이 기능의 동작이 설명되어 있지 않은 이유를 모르겠습니다. 이 함수의 동작을 관찰하는 과정에서 발견된 문서화되지 않은 기능을 사용해야 합니다.

따라서 본질적으로 0과 달라야 하는 요청된 매개변수 데이터의 경우 MarketInfo() 함수는 오류 상황의 문서화되지 않은 신호인 0을 반환할 수 있습니다. 코드는 각 매개변수를 요청할 때 오류가 발생했는지 확인해야 합니다. 이러한 이유만으로 코드에서 3번의 검사가 제공됩니다.

더 나아가. 분명히 계산된 로트 크기는 허용되는 로트 크기 범위에 맞지 않을 수 있습니다. 확인해볼까요? 아니면 결국 우리는 이 상황을 명시적으로 프로그래밍한 다음 "자체적으로 어떻게 될지"가 아니라 최상위 코드에서 이에 대한 반응을 프로그래밍합니까? 모든 것이 프로그래밍되어 있지 않고 자체적으로 작동하는 것처럼 보일 때의 모습에 대한 예는 MT4의 다음 새로운 릴리스가 될 수 있습니다. 무언가가 어딘가로 옮겨졌을 때, 어딘가에서 기적적으로 결함이 발생하고 어딘가에서 작동이 완전히 멈췄을 때 입니다. 아마도 이것이 당신이 얻고자 하는 결과가 아니겠습니까?

생각의 흐름과 적용된 계산 모델을 볼 수 있도록 코드가 확장되고 주석 처리됩니다. MetaQuotes에서 설정한 로트 크기 모델은 MINLOT, MAXLOT 및 LOTSTEP 매개변수로 지정된 "주문 값의 비트 그리드" 형식으로 만들어지기 때문에 이러한 용어로 특정 로트 값을 계산하는 것이 더 논리적입니다. 따라서 계산 모델은 이러한 용어로 구현되었습니다.

"0.5km"나 불필요한 것이 보이지 않습니다. 유일한 것은 함수를 한 번 호출하고 결과 값을 변수에 저장할 때 최대 성능을 달성하는 스타일로 코드가 만들어지고 다음 확인 후에만 각 호출이 실행된다는 것입니다. 반환된 값은 오류 표시기가 아니며 계산을 계속하는 것이 여전히 합리적입니다. 오류가 발생한 것으로 판명되자마자 컴퓨팅 리소스는 더 이상 쓸모없는 호출에 낭비되지 않습니다.

코드를 더 간결하게 하기 위해 3가지 값을 모두 즉시 얻을 수 있고 3가지 조건을 하나의 if'에서 한 번에 확인할 수 있습니다. 그러나 첫 번째 호출에서 오류가 발생하면 다른 두 번의 호출은 컴퓨팅 리소스를 낭비하게 됩니다.

나는 lotStep으로 나누기가 사용되는 표현식을 프로그래밍할 때, lotStep의 값이 0과 다른지, 즉 0으로 나누기가 방금 확인된 if 아래에서 사용된다는 사실에 특별한 주의를 기울였습니다. 아마도 거기에서 발생하지 않을 것입니다. 원칙적으로 모든 변수를 "double" 및 "int", "const double" 및 "const int"로 선언하여 코드의 후속 수정 가능성이 있는 경우 자체로부터 자신을 보호함으로써 코드를 더욱 개선할 수 있습니다. 특히, 변수 lotStep의 값과 0의 값의 차이가 방금 확인된 if 아래에서 이 위치에 새로 추가된 일부 코드에서 실수로 0 값이 이 변수에 잘못 할당된 경우 다음으로 더 나눕니다. 표현식에서 0이 발생합니다.변수가 "const double"로 선언되면 컴파일러에서 lotStep 변수를 수정하는 불법 행위를 즉시 보고하여 이러한 실수를 방지할 수 있기를 바랍니다.

따라서 "반 킬로미터"는 가혹한 객관적 조건 때문이지 누군가의 변덕이 아닙니다.

스레드의 이름은 무엇입니까? 글쎄, 당신이 도움을 준다면 - 그래야 하는 것처럼, 그래서 당신은 정말로 무언가를 배울 수 있습니다.