MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 33

 
spoiltboy :

Tür. Söyle bana, hata nerede?

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" );
  } 

Her şey çalışıyor, maxpr1 fiyatına sipariş veriyor.

Sonra aynı şeyi yapmak istiyorum, ancak minpr1 fiyatına:

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 hatası yazıyor (yanlış duruyor). Neyi yanlış yapıyorum?


Bekleyen bir emir verirken açılış fiyatı piyasaya çok yakın olamaz. Bekleyen fiyatın mevcut piyasa fiyatından puan cinsinden minimum mesafesi de MODE_STOPLEVEL parametresi ile MarketInfo() işlevi kullanılarak elde edilebilir. Bekleyen bir emrin açılış fiyatının yanlış olması durumunda 130 hatası (ERR_INVALID_STOPS) üretilir.

 
Alekseu Fedotov :
Hayır, mesele bu değil, orada bir boşluk var. Üstelik satın almak için bekleyenleri de değiştirmeye çalıştım, aynı grafik üzerinde test ettim, aynı hatalar.
 
spoiltboy :
Hayır, mesele bu değil, orada bir boşluk var. Üstelik satın almak için bekleyenleri de değiştirmeye çalıştım, aynı grafik üzerinde test ettim, aynı hatalar.

Arada boşluk var ama yazılanları okumadığın belli

....... Bekleyen bir emrin açılış fiyatının yanlış olması durumunda 130 hatası (ERR_INVALID_STOPS) oluşacaktır.....

yani OP_SELLLIMIT değerini piyasa fiyatının altına ayarlamaya çalışmak.  

 
Alekseu Fedotov :

Arada boşluk var ama yazılanları okumadığın belli

....... Bekleyen bir emrin açılış fiyatının yanlış olması durumunda 130 hatası (ERR_INVALID_STOPS) oluşacaktır.....

yani OP_SELLLIMIT değerini piyasa fiyatının altına ayarlamaya çalışmak.  

Teşekkürler.
 
//------------закрываем ордер по обратному сигналу удаляем или модифицируем отложки------

   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;} // satış durdurma

if (FRMA1>GrossMA1 && FRMA2<GrossMA2 ) {sig=1;} // satın alma durağı

Buradaki hata nedir.. Açık anlaşmalar kendiliğinden kapanır, geri dönüş sinyali yoktur..

 
Movlat Baghiyev :
if (FMA1<GrossMA1 && FMA2>GrossMA2 ) {sig=2;} // satış durdurma

if (FRMA1>GrossMA1 && FRMA2<GrossMA2 ) {sig=1;} // satın alma durağı

Buradaki hata nedir.. Açık anlaşmalar kendiliğinden kapanır, geri dönüş sinyali yoktur..

Sıfır çubuğunda, olaydan sonra görünmeyen sinyal "titriyor". Test cihazındaki görselleştirmeyi tüm onay işaretlerinde çalıştırın, sorular kaybolacaktır.
 
Vitalie Postolache :
Sıfır çubuğunda, olaydan sonra görünmeyen sinyal "titriyor". Test cihazındaki görselleştirmeyi tüm onay işaretlerinde çalıştırın, sorular kaybolacaktır.
sorun bu değil.Emir tetiklendiğinde bir anlaşma açılır ve yeni bir mum belirdiğinde ve geri dönüş sinyali olmadığında hemen kapanır.
 
Movlat Baghiyev :
sorun bu değil.Emir tetiklendiğinde bir anlaşma açılır ve yeni bir mum belirdiğinde ve geri dönüş sinyali olmadığında hemen kapanır.
Ayarlamadan sonra " sig" değişkenini sıfırlamak gerekir, çünkü sinyal sabit olacaktır, sıfıra sıfırlanırsa değişken bir sonraki kesişimden sonra tekrar bir değer alacaktır ve tüm eylemleri gerçekleştirdikten sonra tekrar sıfırlanacaktır. Peki, ya da yukarı doğru bir kavşak varsa, bir sonrakinin aşağı olması gerektiğini ve aşağı kavşak yoksa, ters kavşak olana kadar tüm sinyallerin yok sayılacağını belirten bir bayrak ayarlayın.
 

Merhaba.

Bana neyin yanlış olduğunu söyle.

M1 döneminde gösterge çizgisi 20. seviyeyi geçtiyse ve M5 döneminde gösterge çizgisi 50. seviyenin üzerindeyse simge ayarlanmalıdır.

Bazı nedenlerden dolayı, M5 üzerindeki çizgi belirtilen 50 seviyesinin altında olsa bile simge yerleştirilir.

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 :

Merhaba.

Bana neyin yanlış olduğunu söyle.

M1 döneminde gösterge çizgisi 20. seviyeyi geçtiyse ve M5 döneminde gösterge çizgisi 50. seviyenin üzerindeyse simge ayarlanmalıdır.

Bazı nedenlerden dolayı, M5 üzerindeki çizgi belirtilen 50 seviyesinin altında olsa bile simge yerleştirilir.

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);
  }

Döngünüz garip. Bazı sıra dışı.

//+------------------------------------------------------------------+
   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--) {
       // основной цикл индикатора
      }
//+------------------------------------------------------------------+

Neden 1'den fazla limit kontrol ediliyor. Örneğin, geçmiş yüklendi ve fark birden fazla olacak. Her şey yolundaysa, o zaman oranları_toplam-önceki_hesaplanan arasındaki fark ya 0 ya da 1'dir.
0 - yeni bir kene geldi, yeni bir çubuk oluşmaya başlamadı.
1 - yeni bir kene geldi ve yeni bir çubuk oluşmaya başladı

Tüm göstergenizi gösterin - orada neyin yanlış olduğunu görelim.