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

 
spoiltboy :

친절한. 오류가 어디에 있습니까?

extern int pointsl= 100 , pointtp= 100 , MagicB= 1111 , MagicS= 2222 , bars= 10 ;   extern double lotB= 0.1 , lotS= 0.1 ;
double slB, tpB, slS, tpS;   double x= 0 , z= 0 ; int ticketUP, ticketD;

void OnTick ()
  {
double maxpr1=- 9999 ; double minpr1= 9999 ;

for ( int shift1= 0 ; shift1<bars; shift1++)
{ double i= iHigh ( Symbol (), PERIOD_CURRENT , shift1);
if (i>maxpr1){maxpr1=i;}}

for ( int shiftA1= 0 ; shiftA1<bars; shiftA1++)
{ double y= iLow ( Symbol (), PERIOD_CURRENT , shiftA1);
if (y<minpr1) {minpr1=y;}}



slS= NormalizeDouble (maxpr1+pointsl* Point , 5 );
tpS= NormalizeDouble (maxpr1-pointtp* Point , 5 );
ticketD= OrderSend ( Symbol (), OP_SELLLIMIT , lotS, maxpr1, 3 , slS, tpS, "" , MagicS, 0 , Blue);
if (ticketD==- 1 ) Print ( "ERROR OP_SELL" ); else Print ( "OP_SELL OK" );
  } 

모든 것이 작동하며 maxpr1 가격으로 주문합니다.

다음으로 나는 같은 일을 하고 싶지만 minpr1의 가격으로:

extern int pointsl= 100 , pointtp= 100 , MagicB= 1111 , MagicS= 2222 , bars= 10 ;   extern double lotB= 0.1 , lotS= 0.1 ;
double slB, tpB, slS, tpS;   double x= 0 , z= 0 ; int ticketUP, ticketD;

void OnTick ()
  {
double maxpr1=- 9999 ; double minpr1= 9999 ;

for ( int shift1= 0 ; shift1<bars; shift1++)
{ double i= iHigh ( Symbol (), PERIOD_CURRENT , shift1);
if (i>maxpr1){maxpr1=i;}}

for ( int shiftA1= 0 ; shiftA1<bars; shiftA1++)
{ double y= iLow ( Symbol (), PERIOD_CURRENT , shiftA1);
if (y<minpr1) {minpr1=y;}}



slS= NormalizeDouble (minpr1+pointsl* Point , 5 );
tpS= NormalizeDouble (minpr1-pointtp* Point , 5 );
ticketD= OrderSend ( Symbol (), OP_SELLLIMIT , lotS, minpr1, 3 , slS, tpS, "" , MagicS, 0 , Blue);
if (ticketD==- 1 ) Print ( "ERROR OP_SELL" ); else Print ( "OP_SELL OK" );
  }

오류 130 (잘못된 중지)을 씁니다. 내가 무엇을 잘못하고 있지?


보류 주문을 할 때 시가는 시장에 너무 가깝지 않아야 합니다. MODE_STOPLEVEL 매개변수와 함께 MarketInfo() 함수를 사용하여 현재 시장 가격에서 보류 중인 가격의 최소 거리(포인트 단위)도 얻을 수 있습니다. 보류 중인 주문의 시작 가격이 잘못된 경우 오류 130(ERR_INVALID_STOPS)이 생성됩니다.

 
Alekseu Fedotov :
아니요, 그게 요점이 아닙니다. 거기에 간격이 있습니다. 또한, 나는 또한 구매 보류를 변경하려고 시도했으며 동일한 차트에서 동일한 오류를 테스트했습니다.
 
spoiltboy :
아니요, 그게 요점이 아닙니다. 거기에 간격이 있습니다. 또한, 나는 또한 구매 보류를 변경하려고 시도했으며 동일한 차트에서 동일한 오류를 테스트했습니다.

Gap Gap, 하지만 당신은 분명히 쓰여진 것을 읽지 않았습니다

........ 미결제 주문 의 시가가 잘못된 경우 오류 130(ERR_INVALID_STOPS)이 발생합니다.............

즉, OP_SELLLIMIT를 시장 가격보다 낮게 설정하려고 합니다.  

 
Alekseu Fedotov :

Gap Gap, 하지만 당신은 분명히 쓰여진 것을 읽지 않았습니다

........ 미결제 주문 의 시가가 잘못된 경우 오류 130(ERR_INVALID_STOPS)이 발생합니다.............

즉, OP_SELLLIMIT를 시장 가격보다 낮게 설정하려고 합니다.  

감사해요.
 
//------------закрываем ордер по обратному сигналу удаляем или модифицируем отложки------

   for ( int i2=total- 1 ; i2>= 0 ; i2--)
     if ( OrderSelect (i2, SELECT_BY_POS ))
         if ( OrderSymbol ()== Symbol ()      )
         if ( OrderMagicNumber ()==Magic)
      {
       if ( OrderType ()== OP_BUY )
      {
     if (sig2== 1 )  { bool cl = OrderClose ( OrderTicket (), OrderLots (), Bid ,Slip, 0 ); if (cl== false ) { Print ( "OrderClose завершилась с ошибкой #" , GetLastError ());}}
    
      }
       if ( OrderType ()== OP_SELL )
      {
     if (sig2== 2 )  { bool cl = OrderClose ( OrderTicket (), OrderLots (), Ask ,Slip, 0 ); if (cl== false ) { Print ( "OrderClose завершилась с ошибкой #" , GetLastError ());}}
    
      }
    
       if ( OrderType ()== OP_BUYSTOP )
      {
    
     if (sig2== 2 &&Delete_Order== true )  { bool del = OrderDelete ( OrderTicket ()); if (del== false ) { Print ( "OrderDelete завершилась с ошибкой #" , GetLastError ());}}
    
     //if (sig==1&&OrderOpenPrice()!=buystop_open&&Ask<buystop_open-stops) {bool mod = OrderModify(OrderTicket(),buystop_open,buystop_sl,0,0);Print("Мод. цены бай стоп=" ,buystop_open,", СЛ=",buystop_sl);if (mod==false) {Print("OrderModify завершилась с ошибкой #",GetLastError());}}
    
      }
    
       if ( OrderType ()== OP_SELLSTOP )
      {
  
     if (sig2== 1 &&Delete_Order== true )  { bool del = OrderDelete ( OrderTicket ()); if (del== false ) { Print ( "OrderDelete завершилась с ошибкой #" , GetLastError ());}}
  
     //if (sig==1&&OrderOpenPrice()!=sellstop_open&&Bid>sellstop_open+stops) {bool mod = OrderModify(OrderTicket(),sellstop_open,sellstop_sl,0,0);Print("Мод. цены бай стоп=" ,sellstop_open,", СЛ=",sellstop_sl);if (mod==false) {Print("OrderModify завершилась с ошибкой #",GetLastError());}}
      
      }
      
      }

    
  
  }
//+------------------------------------------------------------------+
if (FMA1<GrossMA1 && FMA2>GrossMA2 ) {sig=2;} // 판매 중지

if (FRMA1>GrossMA1 && FRMA2<GrossMA2 ) {sig=1;} // 매수 스톱

여기서 실수는 무엇입니까 .. 열린 거래가 자체적으로 닫히고 반환 신호가 없습니다 ..

 
Movlat Baghiyev :
if (FMA1<GrossMA1 && FMA2>GrossMA2 ) {sig=2;} // 판매 중지

if (FRMA1>GrossMA1 && FRMA2<GrossMA2 ) {sig=1;} // 매수 스톱

여기서 실수는 무엇입니까 .. 열린 거래가 자체적으로 닫히고 반환 신호가 없습니다 ..

제로 바에서 신호가 "깜박거려" 나중에는 보이지 않습니다. 모든 틱에 대해 테스터에서 시각화를 실행하면 질문이 사라집니다.
 
Vitalie Postolache :
제로 바에서 신호가 "깜박거려" 나중에는 보이지 않습니다. 모든 틱에 대해 테스터에서 시각화를 실행하면 질문이 사라집니다.
이것은 문제가 아닙니다.주문이 트리거되면 거래가 열리고 새 양초 가 나타나고 반환 신호가 없으면 즉시 닫힙니다.
 
Movlat Baghiyev :
이것은 문제가 아닙니다.주문이 트리거되면 거래가 열리고 새 양초 가 나타나고 반환 신호가 없으면 즉시 닫힙니다.
신호가 일정하기 때문에 설정 후 변수 " sig" 를 재설정해야 합니다. 0으로 재설정하면 변수는 다음 교차 후에 다시 값을 취하고 모든 작업을 수행한 후 다시 재설정합니다. 음, 또는 플래그를 설정하여 위쪽 교차점이 있으면 다음 교차점이 아래로 이동해야 하고 아래쪽 교차점이 없으면 역 교차점이 있을 때까지 모든 신호가 무시됩니다.
 

안녕하세요.

무슨 일이야.

아이콘은 M1 기간에 지표선이 20레벨을 넘고 M5 기간에 지표 선이 50레벨 이상인 경우 설정해야 합니다.

어떤 이유로 M5의 선이 지정된 수준인 50 미만인 경우에도 아이콘이 배치됩니다.

int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//---
Comment ( "" );
int limit = rates_total;
int count=prev_calculated;

for ( int i=limit-count; i>= 1 ;i--)
{
//Getting Stochastic buffer values using the iCustom function
   double Stoch1 = iStochastic ( NULL , 1 ,KPeriod,DPeriod,Slowing, MODE_SMA , 0 , MODE_MAIN ,i);
   double Stoch2 = iStochastic ( NULL , 1 ,KPeriod,DPeriod,Slowing, MODE_SMA , 0 , MODE_MAIN ,i+ 1 );
  
   double Stoch50_1 = iStochastic ( NULL , 5 ,KPeriod1,DPeriod1,Slowing1, MODE_SMA , 0 , MODE_MAIN ,i);
   double Stoch50_2 = iStochastic ( NULL , 5 ,KPeriod1,DPeriod1,Slowing1, MODE_SMA , 0 , MODE_MAIN ,i+ 1 );
  
   if (Stoch1> 20 && Stoch2< 20 &&Stoch50_1> 50 )
  {
   UP[i]= Low [i]-distance*MyPoint;
  }
  // if (Stoch1< 80 && Stoch2> 80 &&Stoch50_1< 50 )
  //{
  // DOWN[i]= High [i]+distance*MyPoint;
  //}
}
//--- return value of prev_calculated for next call
   return (rates_total);
  }
 
mila.com :

안녕하세요.

무슨 일이야.

아이콘은 M1 기간에 지표선이 20레벨을 넘고, M5 기간에 지표 선이 50레벨 이상인 경우 설정해야 합니다.

어떤 이유로 M5의 선이 지정된 수준인 50 미만인 경우에도 아이콘이 배치됩니다.

int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//---
Comment ( "" );
int limit = rates_total;
int count=prev_calculated;

for ( int i=limit-count; i>= 1 ;i--)
{
//Getting Stochastic buffer values using the iCustom function
   double Stoch1 = iStochastic ( NULL , 1 ,KPeriod,DPeriod,Slowing, MODE_SMA , 0 , MODE_MAIN ,i);
   double Stoch2 = iStochastic ( NULL , 1 ,KPeriod,DPeriod,Slowing, MODE_SMA , 0 , MODE_MAIN ,i+ 1 );
  
   double Stoch50_1 = iStochastic ( NULL , 5 ,KPeriod1,DPeriod1,Slowing1, MODE_SMA , 0 , MODE_MAIN ,i);
   double Stoch50_2 = iStochastic ( NULL , 5 ,KPeriod1,DPeriod1,Slowing1, MODE_SMA , 0 , MODE_MAIN ,i+ 1 );
  
   if (Stoch1> 20 && Stoch2< 20 &&Stoch50_1> 50 )
  {
   UP[i]= Low [i]-distance*MyPoint;
  }
  // if (Stoch1< 80 && Stoch2> 80 &&Stoch50_1< 50 )
  //{
  // DOWN[i]= High [i]+distance*MyPoint;
  //}
}
//--- return value of prev_calculated for next call
   return (rates_total);
  }

주기가 이상합니다. 일부 특이한.

//+------------------------------------------------------------------+
   if (rates_total<xxx) return ( 0 );         // xxx здесь - количество баров, при которых невозможно рассчитать индикатор
   int limit=rates_total-prev_calculated;
   if (limit> 1 ) {                           // limit больше 1 в том случае, когда в истории произошли изменения
      limit=rates_total- 1 ;                 // не обязательно -1, если в цикле есть i+1, значит limit=rates_total-2, и т.д., и т.п.
       // тут проводим действия когда нужно пересчитать всю историю
      }
//---
   for ( int i=limit; i>= 0 ; i--) {
       // основной цикл индикатора
      }
//+------------------------------------------------------------------+

제한이 1보다 많이 확인되는 이유. 예를 들어, 히스토리가 로드되었으며 그 차이는 1 이상입니다. 모든 것이 정상이면 Rates_total-prev_calculated의 차이는 0 또는 1입니다.
0 - 새 틱이 도착했으며 새 막대가 형성되기 시작하지 않았습니다.
1 - 새로운 진드기가 도착했고 새로운 막대가 형성되기 시작했습니다.

전체 지표를 표시하십시오. 무엇이 잘못되었는지 봅시다.