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

 
Vitalie Postolache :

Eh, bu başka bir konu, şimdi %1'in neye göre olduğu açık;)

if ( Open [x] > Close [x]+ Open [x]* 0.01 ) {code}
Lanet olsun bu dili anlamayacaksın.. O zaman iki kelime yazmak için 10 satıra ihtiyacın var, sonra 10 kelime yazmak yeterli sadece iki.. Programlama diyorlar sanıyorsun ve muhtemelen bir düzen var ve ortada bir karışıklık var. sonu)) Herkes sevgilim dileklerini yazar)))
 
spoiltboy :
EA, son X çubuğu için minimum ve maksimum hesaplar ve bunlara siparişler verir. Ayrıca, maksimum düşüş veya minimum artış olduğunda, ilgili siparişi silmeniz ve yeni verileri kullanarak açmanız gerekir.


Gecikmeleri ne zaman değiştirdiğinizi tam olarak anlamadım, ancak minimum fiyat mevcut BuyLimit'i ayarlama fiyatından daha yüksekse, bunu yeni Min fiyatla değiştirmeniz gerekecek şekilde yaptım.

SellLimit için - ayna.

Ve bu doğru ya da değil - siz daha iyi bilirsiniz - herhangi bir şey olup olmadığını kontrol edin ve düzeltin - Kodu yeni yazdım, ama hiç kontrol etmedim - Bir değişiklik eklemenizi ve algoritmanın ve kodun doğruluğunu kontrol etmenizi sağlayacağım. genel.

//--- input variables
input      double    LotB= 0.1 ;       // Лот Buy
input      double    LotS= 0.1 ;       // Лот Sell
input      int       Pointsl= 100 ;   // StopLoss в пунктах
input      int       Pointtp= 100 ;   // TakeProfit в пунктах
input      int       NumBars= 10 ;     // Количество баров для поиска Max/Min
input      int       Magic= 100500 ;   // Magic

//--- global variables
struct DataPendingOrder
  {
   int       number;     // Количество
   double    price_set;   // Цена установки
  };

struct DataPending
  {
   DataPendingOrder  buy_limit;   // BuyLimit
   DataPendingOrder  buy_stop;   // BuyStop
   DataPendingOrder  sell_limit; // SellLimit
   DataPendingOrder  sell_stop;   // SellStop
  };

struct DataOrders
  {
   int          buy;     // Количество позиций Buy
   int          sell;     // Количество позиций Sell
   DataPending order;   // Данные отложенного ордера
  };
DataOrders getData;   // Данные ордеров и позиций
double lotB, lotS;
int     pointsl, pointtp, numBars;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   numBars=(NumBars< 1 ? 1 :NumBars> Bars ? Bars :NumBars);
   pointsl=(Pointsl< 0 ? 0 :Pointsl);
   pointtp=(Pointtp< 0 ? 0 :Pointtp);
   double minLot= SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_MIN );
   double maxLot= SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_MAX );
   lotB=(LotB<minLot?minLot:LotB>maxLot?maxLot:LotB);
   lotS=(LotS<minLot?minLot:LotS>maxLot?maxLot:LotS);
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   //--- заполним структуру количеством ордеров и позиций
   GetNumOrders( Symbol (),Magic,getData);
  
   //--- найдём максимальную и минимальную цены за bars свечей
   double maxPrice= 0.0 , minPrice= DBL_MAX ;
   for ( int i= 0 ; i<numBars; i++) {
       double max_i= iHigh ( Symbol (), PERIOD_CURRENT ,i);
       if (max_i>maxPrice) maxPrice=max_i;
       double min_i= iLow ( Symbol (), PERIOD_CURRENT ,i);
       if (min_i<minPrice) minPrice=min_i;
      }

   //--- если нету рыночных Buy
   if (getData.buy== 0 ) {
       //--- если нет отложенного BuyLimit
       if (getData.order.buy_limit.number== 0 ) {
         double slB=(pointsl== 0 ? 0 : NormalizeDouble (minPrice-pointsl* Point (), Digits ()));
         double tpB=(pointtp== 0 ? 0 : NormalizeDouble (minPrice+pointtp* Point (), Digits ()));
         ResetLastError ();
         int ticketUP= OrderSend ( Symbol (), OP_BUYLIMIT , lotB, minPrice, 3 , slB, tpB, "" , Magic, 0 , clrRed );
         if (ticketUP==- 1 ) Print ( "ERROR SETTING OP_BUYLIMIT :" , GetLastError ());
         else Print ( "OP_BUYLIMIT OK" );
         }
       //--- если есть BuyLimit
       else {
         //--- если цена Min больше цены установки BuyLimit
         if (minPrice>getData.order.buy_limit.price_set) {
             // модифицировать BuyLimit - поставить его на цену minPrice ...
             //--- ... и сместить его стоп-уровни относительно новой цены установки
            }
         }
      }
  
   //--- если нету рыночных Sell
   if (getData.sell== 0 ) {
       //--- если нет отложенного SellLimit
       if (getData.order.sell_limit.number== 0 ) {
         double slS=(pointsl== 0 ? 0 : NormalizeDouble (maxPrice+pointsl* Point (), Digits ()));
         double tpS=(pointtp== 0 ? 0 : NormalizeDouble (maxPrice-pointtp* Point (), Digits ()));
         ResetLastError ();
         int ticketD= OrderSend ( Symbol (), OP_SELLLIMIT , lotS, maxPrice, 3 , slS, tpS, "" , Magic, 0 , clrBlue );
         if (ticketD==- 1 ) Print ( "ERROR SETTING OP_SELLLIMIT :" , GetLastError ());
         else Print ( "OP_SELLLIMIT OK" );
         }
       //--- если есть SellLimit
       else {
         //--- если цена Max меньше цены установки SellLimit
         if (maxPrice<getData.order.sell_limit.price_set) {
             // модифицировать SellLimit - поставить его на цену maxPrice ...
             //--- ... и сместить его стоп-уровни относительно новой цены установки
            }
         }
      }

   //---
   string a=(numBars== 1 )? "bar: " : IntegerToString (numBars, 1 )+ " bar's: " ;
   Comment ( "Last " , a, "max " , DoubleToStr (maxPrice, Digits ()), ", min " , DoubleToStr (minPrice, Digits ()), "." );
  }
//+------------------------------------------------------------------+
//| Записывает в структуру количество позиций и отложенных ордеров   |
//+------------------------------------------------------------------+
void GetNumOrders( string symbol_name, int magic_number, DataOrders &data_of) {
   ZeroMemory (data_of);
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) {
       if ( OrderSelect (i, SELECT_BY_POS )) {
         if ( OrderMagicNumber ()!=magic_number) continue ;
         if ( OrderSymbol ()!=symbol_name)       continue ;
         //--- рыночные позиции
         if ( OrderType ()== OP_BUY )    data_of.buy++;
         if ( OrderType ()== OP_SELL )   data_of.sell++;
         //--- отложенные ордера
         if ( OrderType ()== OP_BUYLIMIT )  {  data_of.order.buy_limit.number++;   data_of.order.buy_limit.price_set= OrderOpenPrice ();   }
         if ( OrderType ()== OP_BUYSTOP )   {  data_of.order.buy_stop.number++;    data_of.order.buy_stop.price_set= OrderOpenPrice ();    }
         if ( OrderType ()== OP_SELLLIMIT ) {  data_of.order.sell_limit.number++;  data_of.order.sell_limit.price_set= OrderOpenPrice ();  }
         if ( OrderType ()== OP_SELLSTOP )  {  data_of.order.sell_stop.number++;   data_of.order.sell_stop.price_set= OrderOpenPrice ();   }
         }
      }
}
//+------------------------------------------------------------------+

umarım anlarsın

 
Artyom Trishkin :

Kurulum fiyatını değiştirip yeni seviyeye göre bir alımla durdurmak varken neden silesiniz?

Yeni çalışmaya başladım ve silme seçeneği, işlevin uygulamasını incelemek amacıyla yapıldı, neden çalışmadığı sorusu ortaya çıktı.

Cevap verdiğiniz için hepinize teşekkürler.

 

Dış parametreleri sıfırlama komutunun neye benzemesi gerektiğini bana kim söyleyebilir?

nasıl görünmeli

1) Komutun tetiklenmesi için listede bir dizi gerekli koşul seçilir, sipariş açma diyelim

2) Bir emir açılır ve bu komut artık hiçbir koşulda çalışmaz. İlkenin kendisinin listeye dağılmış olması gerektiğinden, bilete ve sipariş sayısına göre filtreleme bir seçenek değildir.

 
if (MA1>GrossMA1 && MA2<GrossMA2 && Bid>MA1+Mesafe*Nokta() ) ise GrossMA1[0] ise buradaki hata nedir. MA1[0] GrossMA2[1] MA2[1] Hareketlerin kesişimi + hareketleri geçtikten sonra mesafeye göre bir filtre kullanılır . Bu koşul ne ölçüde doğrudur?
 
Movlat Baghiyev :
if (MA1>GrossMA1 && MA2<GrossMA2 && Bid>MA1+Mesafe*Nokta() ) ise GrossMA1[0] ise buradaki hata nedir. MA1[0] GrossMA2[1] MA2[1] Hareketlerin kesişimi + hareketleri geçtikten sonra mesafeye göre bir filtre kullanılır. Bu koşul ne ölçüde doğrudur?

GrossMA1 ve GrossMA2 size ne verirse, büyük olasılıkla bir fark vardır, sonunda şöyle bir şey elde edersiniz:

MA1 = 1.0050

if (MA1 > 0.0052) // yani fiyatın kendisi değil, farkı, yani karşılaştırma yanlış

 
Vitaly Muzichenko :

GrossMA1 ve GrossMA2 size ne verir, büyük olasılıkla bir fark vardır, sonunda şöyle bir şey elde edersiniz:

MA1 = 1.0050

if (MA1 > 0.0052) // yani fiyatın kendisi değil, farkı, yani karşılaştırma yanlış

Söyle bana nasıl doğru olacak?
 
Vitaly Muzichenko :

GrossMA1 ve GrossMA2 size ne verirse, büyük olasılıkla bir fark vardır, sonunda şöyle bir şey elde edersiniz:

MA1 = 1.0050

if (MA1 > 0.0052) // yani fiyatın kendisi değil, farkı, yani karşılaştırma yanlış

FRMA1= iMA ( Symbol (), 0 , Faster_MA_Period, Faster_MA_Shift, Faster_MA_method, Faster_MA_Apply_to, 0 );
    FRMA2= iMA ( Symbol (), 0 , Faster_MA_Period, Faster_MA_Shift, Faster_MA_method, Faster_MA_Apply_to, 1 );

    FMA1= iMA ( Symbol (), 0 , Fast_MA_Period, Fast_MA_Shift, Fast_MA_method, Fast_MA_Apply_to, 0 );
    FMA2= iMA ( Symbol (), 0 , Fast_MA_Period, Fast_MA_Shift, Fast_MA_method, Fast_MA_Apply_to, 1 );

    GrossMA1= iMA ( Symbol (), 0 , Gross_MA_Period, Gross_MA_Shift, Gross_MA_method, Gross_MA_Apply_to, 0 );
    GrossMA2= iMA ( Symbol (), 0 , Gross_MA_Period, Gross_MA_Shift, Gross_MA_method, Gross_MA_Apply_to, 1 );
 
Vitaly Muzichenko :

GrossMA1 ve GrossMA2 size ne verirse, büyük olasılıkla bir fark vardır, sonunda şöyle bir şey elde edersiniz:

MA1 = 1.0050

if (MA1 > 0.0052) // yani fiyatın kendisi değil, farkı, yani karşılaştırma yanlış

Kavşak doğru bir şekilde oluşuyor.Soru daha çok bu koşulla ilgili Bid>MA1+Distanse*Point()
 

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?