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

 
터미널은 단순히 모든 불필요한 문자를 버립니다.

이 볼륨으로 열면:
 0.029

그것은 0.02 랏을 열 것입니다

그런 볼륨으로 열면 :

 NormalizeDouble ( 0.029 , 2 )
그것은 0.03 랏을 열 것입니다
 
multiplicator :

소수 자릿수를 계산하는 방법?

예를 들어 최소 로트가 0.01이라는 것을 알았습니다.

이제 여기서 소수점 이하 자릿수가 2임을 어떻게 추론할 수 있습니까?
그런 다음 주문량을 소수점 이하 두 자리로 정규화합니다.

인코더 는 다음과 같습니다.
 void OnStart ()
  {
   double minlot= MarketInfo ( Symbol (), MODE_MINLOT );
   Alert (d(minlot));
  }




int d( double x)
{
   int n;
   for (n= 0 ;n< 8 ;n++)
   {
       if (x== NormalizeDouble (x,n))      
      {
         return (n);
      }
   }
return (n- 1 );
}
 
multiplicator :
터미널은 단순히 모든 불필요한 문자를 버립니다.

이 볼륨으로 열면:

그것은 0.02 랏을 열 것입니다

그런 볼륨으로 열면 :

그것은 0.03 랏을 열 것입니다

0.25랏을 열어야 한다면? 다음은 기성품 및 작동 기능, 읽기, 사용입니다.

https://www.mql5.com/ru/forum/131859/page8#comment_3359730


승수 :

예를 들어, 함수에 값을 대체합니다: 7 lot.
브로커의 최소 로트 크기는 5이고 로트 단계는 2입니다.

여기에서 내 로트 정규화 기능을 확인할 수 있습니다. 나는 오랫동안 그것을 사용해 왔으며 지금까지 아무도 불평하지 않았습니다. 로트 단계를 찾은 다음 로트 단계 단계의 수로 반올림하려는 곳

 //_______________________________________________________________________
//Нормализация объема лота для ордера up=true - в большую сторону, иначе в меньшую
//_______________________________________________________________________
double NormalizeLot( double value, bool up= false ){
   double res,sizetable[ 9 ] = { 1.0 , 0.1 , 0.01 , 0.001 , 0.0001 , 0.00001 , 0.000001 , 0.0000001 , 0.00000001 };
   double lotStep = MarketInfo ( Symbol (), MODE_LOTSTEP );
   int lotdigits;
   for (lotdigits= 8 ; lotdigits>= 0 ; lotdigits--) if (lotStep <= sizetable[lotdigits]) break ;
   if (up) res = NormalizeDouble ( MathCeil ( MathMin ( MathMax (value, MarketInfo ( Symbol (), MODE_MINLOT )), MarketInfo ( Symbol (), MODE_MAXLOT ))/lotStep)*lotStep,lotdigits); 
         else res = NormalizeDouble ( MathFloor ( MathMin ( MathMax (value, MarketInfo ( Symbol (), MODE_MINLOT )), MarketInfo ( Symbol (), MODE_MAXLOT ))/lotStep)*lotStep,lotdigits);
return (res);}
//_______________________________________________________________________
글쎄요, 예를 들어 0.37과 같이 로트 단계가 있는 서버를 찾으면 사이클에서 필요한 로트를 추가하고 비교하는 것뿐이지만 그런 서버가 없었습니다. 비트코인에 비표준 로트가 있는 것 같습니다. , 일을 하지 않았다, 모르겠다, 특정 상황이 필요하다
Только "Полезные функции от KimIV".
Только "Полезные функции от KimIV".
  • 2011.02.18
  • www.mql5.com
Все функции взяты из этой ветки - http://forum.mql4...
 

좋은 오후, 친애하는 동료 여러분, 바이너리 옵션에 대한 SHI_silvertrend_signal 표시기의 신호(OP_SELL 및 OP_BUY)를 기반으로 거래를 입력하기 위한 고문의 조건을 올바르게 작성하도록 도와주세요. M1 및 M5용. 신호는 이전 캔들의 종가에 옵니다.


- 표시 신호의 순간에 주문을 엽니다. 신호 후 첫 번째 캔들에 대해서만

- 신호 수신 후 5초 이내.

- Slippage 내에서 허용되는 가격 변경



(표시기에는 2개의 버퍼가 있습니다)

표시기 주석에서 // 두 버퍼 모두 0으로 채워집니다. 그렇지 않으면 기간을 변경할 때 쓰레기가 생깁니다.

귀하의 도움과 지원에 미리 감사드립니다!

 void OnTick ()

{

.....

   if ((CountSell() + CountBuy())== 0 && isTradeHours())

   {

      SignalBuy = iCustom ( NULL , 0 , "SST" , AllBars, Otstup, Per, 0 , 0 ); //получаемое значение в формате 4546546549.0 

      SignalSell = iCustom ( NULL , 0 , "SST" , AllBars, Otstup, Per, 1 , 0 );



       if (( Ask <= SignalBuy - Slippage* Point || Ask   <= SignalBuy + Slippage* Point ) && iBarShift ( NULL , 0 , TimeSeconds ( TimeCurrent ())))     //<---- помогите дописать условие

      {

         if ( OrderSend ( Symbol (), OP_BUY , Lots, Ask , Slippage, 0 , 0 , IntegerToString (Expiration), Magic, 0 , Blue) > 0 )

         {

             Print ( "Ордер на покупку открыт!" );

             return ;

         } else Print ( "Ошибка открытия ордера на покупку!" );

      }  

         

       if (( Bid >= SignalSell - Slippage* Point || Bid >= SignalSell + Slippage* Point ) && iBarShift ( NULL , 0 , TimeSeconds ( TimeCurrent ())))   //<---- помогите дописать условие

      {  

       if ( OrderSend ( Symbol (), OP_SELL , Lots, Bid , Slippage, 0 , 0 , IntegerToString (Expiration), Magic, 0 , Red) > 0 )

         {

             Print ( "Ордер на продажу открыт!" );

             return ;

         } else Print ( "Ошибка открытия ордера на продажу!" );

      }

   }

}

.......

표시기 자체의 코드(코드 게시가 포럼의 규칙과 모순되지 않는 경우 인터넷에서 찾았습니까?)

 //+------------------------------------------------------------------+
//|                                           SHI_SilverTrendSig.mq4 |
//|       Copyright © 2003, VIAC.RU, OlegVS, GOODMAN, © 2005, Shurka |
//|                                                 shforex@narod.ru |
//|                                                                  |
//|                                                                  |
//| Пишу программы на заказ                                          |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Shurka"
#property link        "http://shforex.narod.ru"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue
#define   SH_BUY   1
#define   SH_SELL  - 1

//---- Входные параметры
extern int      AllBars= 0 ; //Для скольки баров считать. 0 - для всех.
extern int      Otstup= 30 ; //Отступ.
extern int      Per= 9 ; //Период.
int             SH,NB,i,UD;
double          R,SHMax,SHMin;
double          BufD[];
double          BufU[];
//+------------------------------------------------------------------+
//| Функция инициализации                                            |
//+------------------------------------------------------------------+
int init()
{
   //В NB записываем количество баров для которых считаем индикатор
   if ( Bars <AllBars+Per || AllBars== 0 ) NB= Bars -Per; else NB=AllBars;
   IndicatorBuffers ( 2 );
   IndicatorShortName ( "SST" );
   SetIndexStyle ( 0 , DRAW_ARROW , 0 , 1 );
   SetIndexStyle ( 1 , DRAW_ARROW , 0 , 1 );
   SetIndexArrow ( 0 , 159 );
   SetIndexArrow ( 1 , 159 );
   SetIndexBuffer ( 0 ,BufU);
   SetIndexBuffer ( 1 ,BufD);
   SetIndexDrawBegin ( 0 , Bars -NB); //Индикатор будет отображаться только для NB баров
   SetIndexDrawBegin ( 1 , Bars -NB);
   ArrayInitialize (BufD, 0.0 ); //Забьём оба буфера ноликами. Иначе будет мусор при смене таймфрейма.
   ArrayInitialize (BufU, 0.0 );
   return ( 0 );
}
//+------------------------------------------------------------------+
//| Функция деинициализации                                          |
//+------------------------------------------------------------------+
int deinit()
{
   return ( 0 );
}
//+------------------------------------------------------------------+
//| Собсна индикатор                                                 |
//+------------------------------------------------------------------+
int start()
{
   int CB= IndicatorCounted ();
   /* Тут вот та самая оптимизационная фишка. В язык введена функция, которая возвращает количество
   посчитанных баров, причём очень хитро. При первом вызове индикатора это 0, всё понятно, ещё ничего
   не считалось, а затем выдаёт количество обсчитанных баров минус один. Т.е. если всего баров 100,
   то функция вернёт 99. Я ввёл такой код, выше у меня определялась NB - кол-во баров подлежащих
   обсчёту. В принципе этот параметр можно и выкинуть, однако для тех кто в танке (I80286) можно
   и оставить. Так вот, здесь, при первом вызове NB остаётся прежней, а при последующих уменьшается
   до последнего бара, т.е. 1 или 2, ну или сколько там осталось посчитать*/
   if (CB< 0 ) return (- 1 ); else if (NB> Bars -CB) NB= Bars -CB;
   for (SH= 1 ;SH<NB;SH++) //Прочёсываем график от 1 до NB
   {
       for (R= 0 ,i=SH;i<SH+ 10 ;i++) {R+=( 10 +SH-i)*( High [i]- Low [i]);}      R/= 55 ;

      SHMax = High [ Highest ( NULL , 0 , MODE_HIGH ,Per,SH)];
      SHMin = Low [ Lowest ( NULL , 0 , MODE_LOW ,Per,SH)];
       if ( Close [SH]<SHMin+(SHMax-SHMin)*Otstup/ 100 && UD!=SH_SELL) { BufD[SH]= High [SH]+R* 0.5 ; UD=SH_SELL; }
       if ( Close [SH]>SHMax-(SHMax-SHMin)*Otstup/ 100 && UD!=SH_BUY) { BufU[SH]= Low [SH]-R* 0.5 ; UD=SH_BUY; }
   }
   return ( 0 );
}
 

Igor Makanu :

res = NormalizeDouble ( MathFloor ( MathMin ( MathMax (value, MarketInfo ( Symbol (), MODE_MINLOT )), MarketInfo ( Symbol (), MODE_MAXLOT ))/lotStep)*lotStep,lotdigits);


그들이 그것을 어떻게 왜곡했는지. matmax 다음 matmin. )

 

최적화 키는 어디로 갔습니까?



최적화하는 방법???


 

동료들에게! 지표 신호에 거래를 입력하기위한 조건을 올바르게 지정하는 방법을 알려주십시오.


다음과 같이 Renko 차트에 대한 간단한 고문 을 작성했습니다.

 extern double LotSize = 0.01 ;
extern int Magic = 1 ;

int prevtime = 0 ;

int start() {
 
   
//При образовании нового кубика ренко проверка на Buy или Sell и заключение ордера
   if (prevtime != Time [ 0 ]) {

   if ( Close [ 1 ] > Open [ 1 ]) {
       OrderSend ( Symbol (), OP_BUY , LotSize, ND( Ask ), 3 , 0 , 0 ,   "RG" , Magic, 0 , Blue);
      }
   if ( Close [ 1 ] < Open [ 1 ]) {
       OrderSend ( Symbol (), OP_SELL , LotSize, ND( Bid ), 3 , 0 , 0 , "RG" , Magic, 0 , Red);
      }
      Magic++;
   prevtime = Time [ 0 ];
    }
         return ( 0 );
} 

double ND( double np) {
   return ( NormalizeDouble (np, Digits ));
}


나는 오프라인 차트에 그다지 만족하지 않아서 이 AG_Renko_Chart 표시기와 결합하기로 결정했습니다. 포스트에 첨부합니다.

그러나 함수가 오른쪽 가장자리에서 renko 값을 반환하는 방법은 다음과 같습니다.

 iCustom ( _Symbol ,TF, "AG_Renko_Chart" ,Step, false , false ,Revers, 0 , 0 );

그런데 바를 맨 아래로 구분하는 방법을 몰라서... 그리고 거래가 많지 않게 기능을 제대로 등록하는 방법도...


일반적으로 머리는 더 이상 이해하지 못합니다. 도와주세요!!!!

파일:
 
Roman Shiredchenko :

최적화 키는 어디로 갔습니까?



최적화하는 방법???


이것은 농담입니까 아니면 사회를 조롱하기로 결정 했습니까?


 
Alexey Viktorov :

이것은 농담입니까 아니면 사회를 조롱하기로 결정 했습니까?


이것은 농담이 아니며 농담이 아닙니다.

이단을 게시하기 전에 그림을 주의 깊게 보십시오.

 
Roman Shiredchenko :

이것은 농담이 아니며 농담이 아닙니다.

이단을 게시하기 전에 그림을 주의 깊게 보십시오.

화면 해상도 문제.