KimIV'ten faydalı özellikler - sayfa 88

 

kombat 17.07.2009 22:13

Özetle, 3 lot satın almanın toplamını alıyoruz ve bu 3 lot satış hacminin sayacını belirliyoruz.

................................

Bir seçenek olarak, evet. Halihazırda açık satış emirleri olsa da, EA ihtiyacınız olanları kapatmayabilir. Bu çözülebilir olmasına rağmen.

kombat 17.07.2009 22:13

Ancak şu soruya: TÜM pozisyonları kapatmak mümkün mü?

Evet, sırayla birbiri ardına yapabilirsiniz, bir komut dosyası ile hızlı, aap! ve herşey...

................................

Şimdi kullandığım şey bu. Bir dizi komut dosyası - bunu ya da bunu kullanırsınız... Ama stratejimi bir Uzman Danışman olarak kodlamaya çalıştım ve bir takım zorluklarla karşılaştım.

 
gince >> :
Burada bir şey bende çalışmıyor yani kapanmıyor, hata vermiyor.

b-Positions.mqh kitaplığının ClosePositions() işlevinde KimIV, test cihazında kullanımını yasaklayan diğer ClosePosBySelect() işlevine bir çağrı kullanır:

if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;


Geriye dönük test için, b-ForTest.mqh kitaplığını kullanın

 
BoraBo писал(а) >>

b-Positions.mqh kitaplığının ClosePositions() işlevinde KimIV, test cihazında kullanımını yasaklayan diğer ClosePosBySelect() işlevine bir çağrı kullanır:

if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;

Geriye dönük test için, b-ForTest.mqh kitaplığını kullanın

Kodumu yanlış anladınız... Rusça'ya çeviriyorum... Test modu DEĞİLSE VE (EA'nın ticaret yapmasına İZİN YOKSA VEYA Uzman Danışmanlar durdurulmuşsa), döngüyü iptal edin. Basitçe söylemek gerekirse, araç çubuğundaki "Uzmanlar" düğmesi bırakıldığında bu satır döngüden çıkar.

 
Sory'nin kafası karıştı.
 

İyi akşamlar,

Maalesef dizide de bir uyumsuzluk var... Emir sayma kodu ile lotların 0'dan büyük olması (Lts>0) şartıyla lotlar birer birer kapatılır (kar elde etme şartına göre) , toplam kârın dikkate alınması gerekli olmakla birlikte:

   int Tip ;                                // Тип ордера
   int Ticket = 0 ,                            // Номер ордера
   Tkt ;                                    // Количество номеров ордеров
   double Lot = 0 ,                            // Количество закр. лотов
   Lts ;                                    // Количество лотов всего
   double Price_Cls ;                        // Цена закрытия ордера
   int Errors ;
//--------------------------------------------------------------- 3 --

       for ( int mm = 1 ; mm < = Mas_Ord_Tek [ 0 ] [ 0 ] ; mm + + ) // Цикл по живым ордерам
         {
         if ( Mas_Ord_Tek [ mm ] [ 6 ] = = Tip & &      // Среди ордеров нашего типа
            Mas_Ord_Tek [ mm ] [ 5 ] > Lot & &        // .. выбираем лоты
            Mas_Ord_Tek [ mm ] [ 4 ] > Ticket )      // .. выбираем номер ордера
           {                                // Этот больше ранее найден.
            Lts = Mas_Ord_Tek [ mm ] [ 5 ] + Lot ;
            Tkt = Mas_Ord_Tek [ mm ] [ 4 ] + Ticket ;
           }
         }
       if ( Tip = = 0 ) Price_Cls = Bid ;            // Для ордеров Buy
       if ( Tip = = 1 ) Price_Cls = Ask ;            // Для ордеров Sell
       if ( BuyOrdProf > 100 & & Lts > 0 )
      Ans = OrderClose ( Tkt , Lts , Price_Cls , 0 , Red ) ; // Закрыть все ордера

Ve sipariş sayımında 1'den fazla lot (Lts>1) varsa, lotlar kapatılmaz:

   int Tip ;                                // Тип ордера
   int Ticket = 0 ,                            // Номер ордера
   Tkt ;                                    // Количество номеров ордеров
   double Lot = 0 ,                            // Количество закр. лотов
   Lts ;                                    // Количество лотов всего
   double Price_Cls ;                        // Цена закрытия ордера
   int Errors ;
//--------------------------------------------------------------- 3 --

       for ( int mm = 1 ; mm < = Mas_Ord_Tek [ 0 ] [ 0 ] ; mm + + ) // Цикл по живым ордерам
         {
         if ( Mas_Ord_Tek [ mm ] [ 6 ] = = Tip & &      // Среди ордеров нашего типа
            Mas_Ord_Tek [ mm ] [ 5 ] > Lot & &        // .. выбираем лоты
            Mas_Ord_Tek [ mm ] [ 4 ] > Ticket )      // .. выбираем номер ордера
           {                                // Этот больше ранее найден.
            Lts = Mas_Ord_Tek [ mm ] [ 5 ] + Lot ;
            Tkt = Mas_Ord_Tek [ mm ] [ 4 ] + Ticket ;
           }
         }
       if ( Tip = = 0 ) Price_Cls = Bid ;            // Для ордеров Buy
       if ( Tip = = 1 ) Price_Cls = Ask ;            // Для ордеров Sell
       if ( BuyOrdProf > 100 & & Lts > 1 )
      Ans = OrderClose ( Tkt , Lts , Price_Cls , 0 , Red ) ; // Закрыть все ордера

Hatayı kimin gördüğünü söyle.

Ya da belki Igor, işlevinin kullanımı hakkında yanlış bir anlayışa sahibim?

BuyOrdProf=GetProfitOpenBuyPosInCurrency(OP_BUY); // fonksiyon çağrısı

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в валюте депозита |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetProfitOpenPosInCurrency ( string sy = "" , int op = - 1 , int mn = - 1 ) {
   double p = 0 ;
   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 = = "" ) & & ( op < 0 | | OrderType ( ) = = op ) ) {
         if ( OrderType ( ) = = OP_BUY | | OrderType ( ) = = OP_SELL ) {
           if ( mn < 0 | | OrderMagicNumber ( ) = = mn ) {
            p + = OrderProfit ( ) + OrderCommission ( ) + OrderSwap ( ) ;
           }
         }
       }
     }
   }
   return ( p ) ;
}
 

Igor, lütfen bana PriceOpenLastPos işlevinizi göstergeye nasıl ekleyeceğinizi söyleyin.

Derlerken, editör ilk parantez ve sonraki değişkenler için bir hata veriyor.

double PriceOpenLastPos ( string sy="", int op=-1, int mn=-1) {
tarihsaat t;
çift r=0;
int k=SiparişToplam();

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_SEL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==dk) {
if (t<SiparişAçmaZamanı()) {
t=SiparişAçıkZamanı();
r=SiparişAçıkFiyat();
}
}
}
}
}
}
}
dönüş(r);
}
}

'(' - işlev tanımı beklenmeyen D:\MT4\experts\indicators\Astrea.mq4 (627, 24)
'sy' - değişken tanımlanmadı D:\MT4\experts\indicators\Astrea.mq4 (632, 7)
vb.

Göstergede alım satım sinyalleri üretme mantığını uyguluyorum ve önceden oluşturulmuş sinyali açma/kapama emirleri için global bir değişken aracılığıyla EA'ya gönderiyorum.

Bazı kararlar vermek için emrin açılış fiyatına ihtiyacım var, bu yüzden bu sorunu çözmeye çalışıyorum. Göstergem dinamik, yalnızca demoda veya test cihazında görselleştirme modunda hata ayıklayabilirsiniz.

 

Resim, toplam kârın değil, bireysel siparişlerin kârının dikkate alındığı şekildedir.

 
Angela , derleyici benim fonksiyon tanımımı bu yerde görmeyi beklemiyordu. Bu, kodda daha yüksek bir yerde bir şeye sahip olmadığınız anlamına gelir. Noktalı virgül veya kapanış kaşlı ayraç olabilir. Genel olarak, kodu dikkatlice kontrol edin.
 
hope писал(а) >>
BuyOrdProf=GetProfitOpenBuyPosInCurrency(OP_BUY); // fonksiyon çağrısı

Bir işleve yanlış parametre geçişi. Bunun gibi olmalı:

BuyOrdProf=GetProfitOpenBuyPosInCurrency("", OP_BUY);
 
KimIV >> :

Bir işleve yanlış parametre geçişi. Bunun gibi olmalı:

Bir işlev çağrısında bir sembole bağlantı eklemek yardımcı olmaz. Neden her pozisyon için karı ayrı hesaplıyor (yukarıdaki resim)?

Neden: