KimIV'ten faydalı özellikler - sayfa 26

 
aceventura :

Sipariş sayısının işlevi çalışmayacaktır, çünkü her çift için aynı danışman kendi yöntemiyle yapılandırılır. Ve aynı anda farklı çiftlere sipariş veriyor. Ardından, iki çift için dört sipariş verilirse ortaya çıkacak ve biri çalışıyor, üçü silinecek. ama her biri için tersi olması gerekir

KimIV "filtre" siparişlerindeki tüm işlevler, tip+çift+sihire göre. Onlar. (yani ben! :) çalıştırmayın ve arama yapmayın - bu sayfadan " SecondsAfterCloseLastPos ( string sy = "" , int op =- 1 , int mn =- 1 ) " ) birini belirten "Bir çeşit Sayım"ı çağırarak çiftlerle ilgileniyorsunuz (ilk alanda sadece Symbol() ), büyüleriniz muhtemelen aynı, aynı danışmanları farklı çiftlerde farklı büyülerle çalıştırıyor olsam bile, bu çiftte gerçek sayıda açık sipariş alacaksınız, hatta bu danışman (sihir).

not: işlevi kastetmiştim

 int NumberOfOrders ( string sy = "" , int op =- 1 , int mn =- 1 )

12. sayfadan

 
SergNF :

KimIV "filtre" siparişlerindeki tüm işlevler, tip+çift+sihire göre. Onlar. (yani ben! :) çalıştırmayın ve arama yapmayın - bu sayfadan " SecondsAfterCloseLastPos ( string sy = "" , int op =- 1 , int mn =- 1 ) " ) "Bir çeşit Sayım var" diyerek çiftlerle ilgileniyorsunuz (ilk alanda sadece Symbol()), büyüleriniz muhtemelen aynı, aynı danışmanları farklı çiftlerde farklı büyülerle çalıştırıyor olsam bile, bu çiftte gerçek sayıda açık sipariş alacaksınız , hatta bu danışman (sihir).

not: işlevi kastetmiştim

12. sayfadan

Teşekkür ederim! Çok yardımcı oldu! anlayacağım

 
İzinsiz girdiğim için özür dilerim Çaydanlığa yardım et MT4'te paralel çizgiler nasıl hızlı ve rahat bir şekilde oluşturulur?
 
extern double Lots = 0.1 ;
extern double TrailingStop = 10 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start ()
  {
   double ADXg_1 , ADXr_1 , ao2 , ao1 , ac1 , ac2 ;
   double P_up0 , P_down0 , P_up1 , P_down1 ;
   int cnt , ticket , total ;
 
   if ( Bars < 100 )
     {
      Print ( " bars less than 100 " ) ;
      return ( 0 ) ;  
     }
   P_up0 = iCustom ( 0 , 0 , " Ценовой канал " , 5 , 0 , 0 ) ;
   P_down0 = iCustom ( 0 , 0 , " Ценовой канал " , 5 , 1 , 0 ) ;
   P_up1 = iCustom ( 0 , 0 , " Ценовой канал " , 5 , 0 , 1 ) ;
   P_down1 = iCustom ( 0 , 0 , " Ценовой канал " , 5 , 1 , 1 ) ;
   ADXg_1 = iCustom ( 0 , 0 , " ADX пересечение " , 14 , 10000 , 0 , 1 ) ;
   ADXr_1 = iCustom ( 0 , 0 , " ADX пересечение " , 14 , 10000 , 1 , 1 ) ;
   ao1 = iAO ( 0 , 0 , 1 ) ;
   ao2 = iAO ( 0 , 0 , 2 ) ;
   ac1 = iAC ( 0 , 0 , 1 ) ;
   ac2 = iAC ( 0 , 0 , 2 ) ;
//задали все данные 
 
   total = OrdersTotal () ;
   if ( total < 1 ) 
     {
      // Проверка свободной маржи
      if ( AccountFreeMargin () < ( 1000 * Lots ))
        {
         Print ( " We have no money. Free Margin = " , AccountFreeMargin ()) ;
         return ( 0 ) ;  
        }
      // Условие открытие позиции BUY
      if ( ADXg_1 < ADXr_1 && ao2 < ao1 && ac2 < ac1 )
        {
         ticket = OrderSend ( Symbol () , OP_BUY , Lots , Ask , 3 , 0 , 0 , "" , 16384 , 0 , Green ) ;
         if ( ticket > 0 )
           {
            if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES )) Print ( " BUY order opened : " , OrderOpenPrice ()) ;
           }
         else Print ( " Error opening BUY order : " , GetLastError ()) ; 
         return ( 0 ) ; 
        }
      // Условие открытие позиции SELL
      if ( ADXg_1 > ADXr_1 && ao2 > ao1 && ac2 > ac1 )
        {
         ticket = OrderSend ( Symbol () , OP_SELL , Lots , Bid , 3 , 0 , 0 , "" , 16384 , 0 , Red ) ;
         if ( ticket > 0 )
           {
            if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES )) Print ( " SELL order opened : " , OrderOpenPrice ()) ;
           }
         else Print ( " Error opening SELL order : " , GetLastError ()) ; 
         return ( 0 ) ; 
        }
      return ( 0 ) ;
     }
    
   for ( cnt = 0 ; cnt < total ; cnt ++ )
     {
      OrderSelect ( cnt , SELECT_BY_POS , MODE_TRADES ) ;
      if ( OrderType () <= OP_SELL &&   
         OrderSymbol () == Symbol ())  
        {
         if ( OrderType () == OP_BUY )   // длинная позиция открыта
           {
            // условие закрытие длинной позиции
            if ( P_down1 > P_down0 )
                {
                 OrderClose ( OrderTicket () , OrderLots () , Bid , 3 , Violet ) ; 
                 return ( 0 ) ; 
                }
            if ( TrailingStop > 0 )  
              {                 
               if ( Bid - OrderOpenPrice () > Point * TrailingStop )
                 {
                  if ( OrderStopLoss () < Bid - Point * TrailingStop )
                    {
                     OrderModify ( OrderTicket () , OrderOpenPrice () , Bid - Point * TrailingStop , OrderTakeProfit () , 0 , Green ) ;
                     return ( 0 ) ;
                    }
                 }
              }
           }
         else 
           {
            // условие закрытия короткой позиции
            if ( P_up1 < P_up0 )
              {
               OrderClose ( OrderTicket () , OrderLots () , Ask , 3 , Violet ) ; 
               return ( 0 ) ; 
              }
            if ( TrailingStop > 0 )  
              {                 
               if (( OrderOpenPrice () - Ask ) > ( Point * TrailingStop ))
                 {
                  if (( OrderStopLoss () > ( Ask + Point * TrailingStop )) || ( OrderStopLoss () == 0 ))
                    {
                     OrderModify ( OrderTicket () , OrderOpenPrice () , Ask + Point * TrailingStop , OrderTakeProfit () , 0 , Red ) ;
                     return ( 0 ) ;
                    }
                 }
              }
           }
        }
     }
   return ( 0 ) ;
  }
Bana yardım et lütfen. İzleyen bir durdurma kullanarak basit bir Uzman Danışman derledi.

+5 puanlık bir arka stop nasıl ayarlanır ve daha sonra taşınmaz, kapanma gerçekleşir

gömülü göstergeler? Mümkünse bir örnekle!
 
KimIV писал (а) >>

Muhtemelen hayır ... Sadece iki parmağım var: işaret parmağım ve kavramam ... gee

Igor, eşcinsel olmasam da sana aşık oldum. Ne de olsa sen ve Zadornov çalışabilirsiniz.

 

SecondsAfterOpenLastPos() işlevi.

Bu fonksiyon, son pozisyonun açılmasından bu yana geçen saniye sayısını döndürür. Dikkate alınacak pozisyonların seçimi harici parametreler tarafından belirlenir:

  • sy - Piyasa aracının adı. Bu parametreyi ayarlarsanız, işlev yalnızca belirtilen takımın konumlarını dikkate alacaktır. Varsayılan değer "" herhangi bir piyasa aracı anlamına gelir. NULL değeri, geçerli enstrüman anlamına gelir.
  • op - Ticaret işlemi, pozisyon türü. Geçerli değerler: OP_BUY , OP_SELL veya -1 . Varsayılan değer -1 , herhangi bir konum anlamına gelir.
  • mn - Konum Kimliği, MagicNumber. Varsayılan değer -1 , herhangi bir tanımlayıcı anlamına gelir.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество секунд после открытия последней позиций. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime SecondsAfterOpenLastPos ( string sy = "" , int op =- 1 , int mn =- 1 ) {
   datetime t ;
   int        i , k = OrdersTotal () ;

   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 ) {
               if ( t < OrderOpenTime ()) t = OrderOpenTime () ;
             }
           }
         }
       }
     }
   }
   return ( TimeCurrent () - t ) ;
}
PS Ekli, SecondsAfterOpenLastPos() işlevini test etmek için bir komut dosyasıdır.
 

Elbette, çok üzgünüm, yaptığınız şey elbette iyi.

Ama NASIL yapıyorsun, kesinlikle sevmiyorum.

1. Değişkenlerin isimlerini tanımlamanız harika, ancak bir sonraki vahşi kısaltmanın ne anlama geldiğini görmek için başlığa her tırmandığınızda - bu bir teneke, değişkenin ne için olduğunu anlarken, ne için olduğunu unutacaksınız. kodda öğrenmek istedim. İngilizce bilen biri için yorumsuz bile anlaşılabilecek, özellikle de bunu başkaları için yaptığınızdan ve yaşamda bu kadar kaliteli olan bu kişilerin hata bulmayacağı YÜKSEK KALİTE kendi kendine belgelenmiş kod yazmak gerçekten imkansız mı? varsa kodlayın.



2. İşlev aşırı yüklenmesi. Evrensellik KÖTÜ, bir fonksiyon için 6 parametre çoktur.



3. Kodun basitliği

Misal.

 datetime SecondsAfterOpenLastPos ( string sy = "" , int op =- 1 , int mn =- 1 ) {
   datetime t ;
   int        i , k = OrdersTotal () ;
 
   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 ) {
               if ( t < OrderOpenTime ()) t = OrderOpenTime () ;
             }
           }
         }
       }
     }
   }
   return ( TimeCurrent () - t ) ;
}

Bu senin kodun. Bununla neler yapabileceğimize bir bakalım:

 datetime SecondsAfterOpenLastPos ( string symbol = "" , int type = - 1 , int magic = - 1 ) 
{
   datetime nearestTime = 0 ; // Инициализировать не надо? Самые сложно находимые ошибки.
   int count = OrdersTotal () ;
 
   if ( symbol == " 0 " ) 
     symbol = Symbol () ;
 
   for ( int i = 0 ; i < count ; i ++ ) 
   {
     // invalid select    
     if ( ! OrderSelect ( i , SELECT_BY_POS )) continue ;
     
     // not needed symbol     
     if ( OrderSymbol () != symbol && symbol != "" ) continue ;
 
     int currentType = OrderType () ;
 
     // only active orders are checked     
     if ( currentType != OP_BUY && currentType != OP_SELL ) continue ;
     
     // type doesn't pass     
     if ( type > 0 && currentType != type ) continue ;
 
     // magic number doesn't pass     
     if ( magic > 0 && OrderMagicNumber () != magic ) continue ;
 
     if ( nearestTime < OrderOpenTime ()) nearestTime = OrderOpenTime () ;
   }
 
   return ( TimeCurrent () - nearestTime ) ;
}

Kodu karşılaştırın? O da aynısını yapıyor.

1. Evet, kodum daha büyük ama sonuçta disketler çağında yaşamıyoruz, yeterli alan var mı ???

2. İçerideki kodum çok daha net. Yerine eklenen yorumlar olmadan bile.

3. İşlevinizin iç içe geçmesi 7, bende 2 var, bir fark var mı?

4. Bu, aşırı yüklenmeyen birkaç işlevden biridir, ancak açma, değiştirme ve bunun gibi diğerleri bir tenekedir.



ZYZH: Bunu yazdığınız kişilere saygı gösterin.

 

Но КАК вы это делаете, мне абсолютно не нравится.

-1. Aynı fikirde olmamak. Kesinlikle her şey hem biçim hem de içerik olarak uygundur. Lütfen aynı formatta devam edin.

Evet, kodum daha büyük

Aynen öyle. Ve kod ne kadar küçükse, anlaşılması o kadar kolay olur. 2-3 ekranda f-th "bulaşmış" olmaktan nefret ediyorum. İşlev, çevirme olmadan ekranda olmalıdır. Bu nedenle, kompaktlıktan yanayım.

İşlevinizin iç içe geçmesi 7, bende 2 var, bir fark var mı?

Bu arada, okuyucunun dikkatini tekrar kendilerine çeken çok sayıda isteğe bağlı sürekliliğiniz olması sorun değil mi?

 
Andrey ( TheXpert ), yorumlarınız ve önerileriniz için teşekkür ederiz! Hepsi kesinlikle adil ve ifadelerinizde kesinlikle haklısınız!
 

DeleteOppositeOrders() işlevi.

Bu fonksiyon, op parametresinde belirtilen pozisyonun tersi olan bir veya daha fazla emri kaldırır. Örneğin, Buy pozisyonları SellLimit ve SellStop emirlerinin karşısında olacaktır. Örneğin, iki zıt emir verildiğinde ve bunlardan biri tetiklendiğinde, karşıt bir emrin kaldırılması gerekli hale gelir.

  • sy - Piyasa aracının adı. Bu parametreyi ayarlarsanız, işlev yalnızca belirtilen takımın konumlarını dikkate alacaktır. Varsayılan değer "" herhangi bir piyasa aracı anlamına gelir. NULL değeri, geçerli enstrüman anlamına gelir.
  • op - Ticaret işlemi, pozisyon türü. Geçerli değerler: OP_BUY , OP_SELL veya -1 . Varsayılan değer -1 , herhangi bir konum anlamına gelir.
  • mn - Konum Kimliği, MagicNumber. Varsayılan değer -1 , herhangi bir tanımlayıcı anlamına gelir.
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.06.2008                                                     |
//|  Описание : Удаление ордеров, противоположных позиции                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void DeleteOppositeOrders ( string sy = "" , int op =- 1 , int mn =- 1 ) {
   bool eb , es ;

   switch ( op ) {
     case OP_BUY : eb = ExistPositions ( sy , OP_BUY , mn ) ; break ;
     case OP_SELL : es = ExistPositions ( sy , OP_SELL , mn ) ; break ;
     default :       eb = ExistPositions ( sy , OP_BUY , mn ) ;
                   es = ExistPositions ( sy , OP_SELL , mn ) ; break ;
   }

   if ( eb ) {
     DeleteOrders ( sy , OP_SELLLIMIT , mn ) ;
     DeleteOrders ( sy , OP_SELLSTOP , mn ) ;
   }
   if ( es ) {
     DeleteOrders ( sy , OP_BUYLIMIT , mn ) ;
     DeleteOrders ( sy , OP_BUYSTOP , mn ) ;
   }
}
not. Ekli, DeleteOppositeOrders() işlevini test etmek için bir komut dosyasıdır.
Neden: