[UYARI, KONU KAPALI!] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde. - sayfa 276

 
rid >> :

Bu dosyalardan (önceden MT4'te gömülü olan) bir işlevi kullanırken (çağırırken), danışmanın yanlış çalışması durumunda, kodda yaptığımız hatanın numarasını günlükte görebiliriz.

Örneğin, GetLastError() işlevini çağırırız:

Bu durumda, kodda bir hata yaptıysak veya harici parametreleri yanlış ayarladıysak, bu hatanın numarası logda gösterilecektir.

Örneğin, - 130.

Ve sayfadaki sayının kodunun çözülmesine bakabilirsiniz - https://book.mql4.com/ru/appendix/errors

Ve artık kodun tamamını kürek çekmemize gerek kalmayacak, çünkü bu numaradan zaten biliyoruz - hatanın tam olarak nerede yapıldığını!

Biraz ince ayar yapacağım: GetLastError işlevi bir başlık dosyası olmadan çağrılır, ancak sitelerde gezinmeden hatanın açıklamasını almak için zaten kitaplığı eklemeniz gerekir:

 #include <stderr.mqh>
#include <stdlib.mqh>

. . .
Print ( "Ошибка открытия ордера BUY #" , ErrorDescription ( GetLastError ( ) ) ) ;
. . .
 
rid писал(а) >>

Fonksiyonu yanlış çağırdınız.

Bunu şöyle adlandırdınız: if (NumberOfPositions(NULL,Magic)> 1)

Ve şöyle olması gerekiyor:


Farkı hissedin ("-1"i kaçırdınız)! ve KODUNUZU DÜZELTİN.

Ve kontrol için grafikte yorumları görüntüleyebilirsiniz. Örneğin, bunun gibi (BAŞLAT işlevinin en başında)

İkinci koşulunuza gelince, ben ("daha fazla uzatmadan"), ikinci koşula göre pozisyonları açmak için başka bir sihir ve ayrı bir Open_Buy_2() işlevi ayarlardım!

Ardından ikinci koşulun kodu şöyle görünür:

kurtulmak

Teşekkürler, hatayı düzelttim, ikinci koşulun neden çalışmadığı da anlaşıldı, muhtemelen görevi doğru açıklamadım:

Danışmanın, prensipte, emirlerin kendisi tarafından açılıp açılmadığını, bu emirler uzun zaman önce kapatılmış olsa bile ayırt etmesi gerekir. NumberOfPositions çalışır, ancak mevcut açık pozisyonların sayısını sayar, eğer pozisyon kapalıysa, o zaman değer sırasıyla sıfırdır. (bu yüzden çalışmıyor)

EA kodumda, önceki pozisyonun verilerini dikkate alarak sonraki her pozisyonu açan bir komut dosyası var ve henüz önceki pozisyonlar yoksa, ilk emir bu koşul olmadan açılmalıdır (aksi takdirde EA basitçe açmaz). Başlat). Bunları ayırmak için, bu Expert Advisor'ın en az bir siparişinin açılıp açılmadığını (sipariş daha sonra kapatılmış olsa bile) anlayan bir fonksiyon olması gerektiği ortaya çıkıyor. Henüz sipariş yoksa (işin başlangıcı), ikinci koşul dikkate alınmadan ilk sipariş açılır ve sonraki tüm siparişler ikinci koşul dikkate alınarak açılır, yani. geçmiş siparişlere göre.

Fonksiyonu bu şekilde ayarlamak mümkün mü?

 

Lütfen bana iTime işlevinin ne gösterdiğini söyleyin.

Bu 10 basamaklı abra-kadabra nedir? saniye?

Nasıl yıl-ay-gün-saat-dakika'ya dönüştürülürler?

 

Açık. Tarihte bunun gibi pozisyonlar olup olmadığını belirleyebilirsiniz:

  for ( int i = 0 ; i < OrdersTotal ( ) ; i + + )                          {
    if ( ! ( OrderSelect ( i , SELECT_BY_POS , MODE_HISTORY ) ) ) continue ;
//выбираем из истории счета
    if ( OrderSymbol ( ) ! = Symbol ( ) ) continue ;    
     if ( OrderMagicNumber ( ) = = Magic )                            {
              позиции = true ;
                                                             } }
                  



Ancak o zaman kodunuz yalnızca test cihazında çalışır. Çünkü Aksi takdirde, çevrimiçi danışmanı her açtığınızda sihri değiştirmeniz gerekecektir.

Görünüşe göre, hesap geçmişinin alındığı zamanı ayarlamanız gerekiyor.

Onlar. verilen büyü ile en son ne zaman anlaşma açıldı/kapatıldı? Altı ay önce mi yoksa bir gün önce mi?

Fonksiyonlar var, kedi. son anlaşmanın açılış veya kapanışının çubuk numarasını (geçmişin derinliklerinde mevcut olandan sayarak) döndürür.


 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru/                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает номер бара открытия последней позиции или -1.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    op - операция                   (   -1       - любая позиция)           |
//|    mn - MagicNumber                (   -1       - любой магик)             |
//+----------------------------------------------------------------------------+
int NumberOfBarOpenLastPos ( string sy = "0" , int tf = 0 , int op = - 1 , int mn = - 1 ) {
  datetime t ;
  int      i , k = OrdersTotal ( ) ;

  if ( sy = = "" | | sy = = "0" ) sy = Symbol ( ) ;
  for ( i = 0 ; i < k ; i + + ) {
    if ( OrderSelect ( i , SELECT_BY_POS , MODE_TRADES ) ) {
      if ( OrderSymbol ( ) = = sy ) {
        if ( OrderType ( ) = = OP_BUY | | OrderType ( ) = = OP_SELL ) {
          if ( op < 0 | | OrderType ( ) = = op ) {
            if ( mn < 0 | | OrderMagicNumber ( ) = = mn ) {
              if ( t < OrderOpenTime ( ) ) t = OrderOpenTime ( ) ;
            } } } } } }  return ( iBarShift ( sy , tf , t , True ) ) ; }

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru/                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает номер бара закрытия последней позиции или -1.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    op - операция                   (   -1       - любая позиция)           |
//|    mn - MagicNumber                (   -1       - любой магик)             |
//+----------------------------------------------------------------------------+
int NumberOfBarCloseLastPos ( string sy = "0" , int tf = 0 , int op = - 1 , int mn = - 1 ) {
  datetime t ;
  int      i , k = OrdersHistoryTotal ( ) ;

  if ( sy = = "" | | sy = = "0" ) sy = Symbol ( ) ;
  for ( i = 0 ; i < k ; i + + ) {
    if ( OrderSelect ( i , SELECT_BY_POS , MODE_HISTORY ) ) {
      if ( OrderSymbol ( ) = = sy ) {
        if ( OrderType ( ) = = OP_BUY | | OrderType ( ) = = OP_SELL ) {
          if ( op < 0 | | OrderType ( ) = = op ) {
            if ( mn < 0 | | OrderMagicNumber ( ) = = mn ) {
              if ( t < OrderCloseTime ( ) ) t = OrderCloseTime ( ) ;
            } } } } }  }  return ( iBarShift ( sy , tf , t , True ) ) ; }

Örneğin. Bu işlevleri kodumda şöyle kullandım:
 //======================================================================
// запретить торговлю - в день , если с начала текущих суток
//уже были открыты или закрыты позиции с заданным магиком
if ( NumberOfBarOpenLastPos ( NULL , 1440 , - 1 , Magic ) = = 0 
     | |  NumberOfBarCloseLastPos ( NULL , 1440 , - 1 , Magic ) = = 0 )
    Trade = false ;       else Trade = true ;
//================================================================

Veya bunun gibi:
 //======================================================================
// запрет торговли  , если за последние 85 баров графика Н1
//т.е. за посл.85 часов)уже были открыты   позиции  или
// закрыты позиции с заданным магиком
if ( NumberOfBarOpenLastPos ( NULL , 60 , - 1 , Magic ) < = 85 
     | |  NumberOfBarCloseLastPos ( NULL , 60 , - 1 , Magic ) < = 85 )
    Trade = false ;       else Trade = true ;
 
Kral! Yardım. mesajın görüntülenmesi için kodun nasıl yazılacağı. kapalı son mumun beyaz (yukarı) veya siyah (aşağı) olduğunu. Saçma olduğunu biliyorum ama yine de...

 

Hmm.Aynı basit problemden ben de muzdaribim.. bir pozisyon denizi açıyor ve artık sadece 1'e ihtiyacınız yok ve satın alma kapandığında ve bir satış açma sinyali geldiğinde... Lütfen bana söyleyin ve ne olduğunu düzeltin. yanlış. aşağıdaki kodda.. Ve sihri nereye yazmanız gerekiyor? Sizin için zor değilse, aptal bir test örneği yapın Böylece çaprazlama yaparken, satın alın (1'den fazla değil) ve aşağı, ayrıca 1'den fazla satmayın. Bunun birçok yeni başlayanın sorularını hemen çözeceğini düşünüyorum. Şimdiden teşekkürler

//---- input parameters
extern int        Ema1 = 14 ;
extern int        Ema2 = 48 ;
double Ema_1 ;
double Ema_2 ;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start ( )
   {
   int Orders = OrdersTotal ( ) ; 
   Ema_1 = iMA ( NULL , 0 , Ema1 , 0 , MODE_SMMA , PRICE_MEDIAN , 0 ) ;
   Ema_2 = iMA ( NULL , 0 , Ema2 , 0 , MODE_SMMA , PRICE_MEDIAN , 0 ) ;
   
   int ticket ;
   if ( NumberOfPositions ( NULL , OP_BUY ) < 1 & & Ema_1 > Ema_2 ) 
     {
      ticket = OrderSend ( Symbol ( ) , OP_BUY , 0.5 , Ask , 10 , Ask - 850 * Point , Ask + 550 * Point , "kupil" , 16384 , 0 , Green ) ;
     } 
   if ( NumberOfPositions ( NULL , OP_BUY ) < 1 & & Ema_1 < Ema_2 ) 
     {
      ticket = OrderSend ( Symbol ( ) , OP_SELL , 0.5 , Bid , 10 , Ask + 850 * Point , Bid - 550 * Point , "kupil" , 16384 , 0 , Green ) ;
     } 
   return ( 0 ) ;
   }

int NumberOfPositions ( string sy = "" , int op = - 1 , int mn = - 1 ) {
   int i , k = OrdersTotal ( ) , kp = 0 ;

   if ( sy = = "0" ) sy = Symbol ( ) ;
   for ( i = 0 ; i < k ; i + + )                                      {
     if ( OrderSelect ( i , SELECT_BY_POS , MODE_TRADES ) )        {
       if ( OrderSymbol ( ) = = sy | | sy = = "" )                    {
         if ( OrderType ( ) = = OP_BUY | | OrderType ( ) = = OP_SELL ) {
           if ( op < 0 | | OrderType ( ) = = op )                    {
             if ( mn < 0 | | OrderMagicNumber ( ) = = mn ) kp + + ;
           } } } } }
   return ( kp ) ;
}
 

Başka bir aptal soru:

- Öğe sayısı harici bir değişken tarafından verilen bir dizi nasıl bildirilir.

 
chaynik_1 >> :
Kral! Yardım. mesajın görüntülenmesi için kodun nasıl yazılacağı. kapalı son mumun beyaz (yukarı) veya siyah (aşağı) olduğunu. Saçma olduğunu biliyorum ama yine de...

Bunun gibi -

 if ( (Open [ 1 ] - Close [ 1 ] ) < 0  ) Comment ( "1 свеча =  бычья" ) ;
 
alderru >> :

Başka bir aptal soru:

- Öğe sayısı harici bir değişken tarafından verilen bir dizi nasıl bildirilir.

https://docs.mql4.com/en/array/ArrayResize

 
morok >> :

Hmm.Aynı basit problemden ben de muzdaribim.. bir pozisyon denizi açıyor ve artık sadece 1'e ihtiyacınız yok ve satın alma kapandığında ve bir satış açma sinyali geldiğinde... Lütfen bana söyleyin ve ne olduğunu düzeltin. yanlış. aşağıdaki kodda.. Ve sihri nereye yazmanız gerekiyor? Sizin için zor değilse, aptalca bir test örneği yapın Böylece çaprazlama yaparken, satın alın (1'den fazla değil) ve aşağı, ayrıca 1'den fazla satmayın. Bunun birçok yeni başlayanın sorularını hemen çözeceğini düşünüyorum. Şimdiden teşekkürler

Şu şekilde deneyin:

(f-ve NumberOfPositions() değerlerini daha dikkatli bir şekilde ayarlamanız gerekir, çünkü başlık boşuna değil:

/| Açıklama : | Açıklama : Konum sayısını döndürür.
//| Seçenekler: |
//| sy - alet adı ("" veya NULL - geçerli sembol) |
//| operasyon - operasyon ( -1 - herhangi bir pozisyon) |
//| mn - MagicNumber ( -1 - herhangi bir büyü) |
//+------------------------------------------- ------------------------------+

 extern int       Magic = 5675 ;
extern int       Ema1 = 14 ;
extern int       Ema2 = 48 ;
double Ema_1 ;
double Ema_2 ;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start ( )
  {
   //int Orders = OrdersTotal(); 
   Ema_1 = iMA ( NULL , 0 , Ema1 , 0 , MODE_SMMA , PRICE_MEDIAN , 0 ) ;
   Ema_2 = iMA ( NULL , 0 , Ema2 , 0 , MODE_SMMA , PRICE_MEDIAN , 0 ) ;   
   int ticket ;
//------------------------------------------------
 if ( NumberOfPositions ( NULL , OP_BUY , Magic ) < 1 & & Ema_1 > Ema_2 ) 
    {
      ticket = OrderSend ( Symbol ( ) , OP_BUY , 0.5 , Ask , 10 , Ask - 850 * Point , Ask + 550 * Point , "kupil" , 16384 , 0 , Green ) ;
    } 
//------------------------------------------------------
   if ( NumberOfPositions ( NULL , OP_SELL , Magic ) < 1 & & Ema_1 < Ema_2 ) 
    {
      ticket = OrderSend ( Symbol ( ) , OP_SELL , 0.5 , Bid , 10 , Ask + 850 * Point , Bid - 550 * Point , "kupil" , 16384 , 0 , Green ) ;
    } 
//------------------------------------------------------
   return ( 0 ) ;
  }

//жжжжжжжжж Пользовательские функции жжжжжжж

int NumberOfPositions ( string sy = "" , int op = - 1 , int mn = - 1 ) {
  int i , k = OrdersTotal ( ) , kp = 0 ;

  if ( sy = = "0" ) sy = Symbol ( ) ;
  for ( i = 0 ; i < k ; i + + )                                    {
    if ( OrderSelect ( i , SELECT_BY_POS , MODE_TRADES ) )      {
      if ( OrderSymbol ( ) = = sy | | sy = = "" )                   {
        if ( OrderType ( ) = = OP_BUY | | OrderType ( ) = = OP_SELL ) {
          if ( op < 0 | | OrderType ( ) = = op )                   {
            if ( mn < 0 | | OrderMagicNumber ( ) = = mn ) kp + + ;
          } } } } }
  return ( kp ) ;
}
Neden: