KimIV'ten faydalı özellikler - sayfa 86

 

Igor! Bana söyler misin? Göstergeden ( iMA ) bir şey Uzman Danışmana 4 ondalık basamakla geliyor, ancak çalışmak için 5'e ihtiyacınız var!? NormalizeDouble(iMA,Digits) denedim - hala 4 basamak. 5 basamak elde etmek için tüm göstergeyi bir Uzman Danışmanın alt rutin işlevine yeniden yazmak gerçekten gerekli mi?!!!

 

Yardım: Uyarı(), Yorum(), Yazdır()

Çift veri, noktadan sonra 4 ondalık basamakla verilir.

Sayıları daha hassas bir şekilde görüntülemek için DoubleToStr() işlevini kullanın.

 

İyi akşamlar,

Pozisyonların doğru kapanmasıyla baş edemiyorum. Koşullara göre iki kapanış koşulu vardır: 1. bir pozisyon açıksa; 2. iki (veya daha fazla) pozisyon açıksa. Her iki durumda da parti hacmi = 0.03. İlk durumda, lot 0.01'de ayrı ayrı kapatılır (yukarıdaki gönderilerde çalışıldı). İkinci durumda, iki lotun her ikisi de 0,03'te kapanmalıdır. Buna göre, eğer:

 if ( OrderType ( ) = = OP_BUY & & BuyTotalOp = = 1 )

sonra ilk kapatma seçeneği ve eğer:

 if ( OrderType ( ) = = OP_BUY & & BuyTotalOp > 1 )

sonra diğeri (benim versiyonumda (başlangıçta) her iki pozisyonun kâr toplamı > 0 ise, o zaman her iki pozisyon da kapatılmalıdır). Şuna benziyor:

   extern double Lots = 0.03 ;            // Жестко заданное колич. лотов
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
   // Учёт количества имеющихся ордеров
   Symb = Symbol ( ) ;                                // Название фин.инстр.
   BuyTotalOp = 0 ;                                  // Количество Buy ордеров
   SellTotalOp = 0 ;                                // Количество Sell ордеров
   for ( int i = 1 ; i < = OrdersTotal ( ) ; i + + )          // Цикл перебора ордер
       {
       if ( OrderSelect ( i - 1 , SELECT_BY_POS ) = = true ) // Если есть следующий
         {                                        // Анализ ордеров:
         if ( OrderSymbol ( ) ! = Symb ) continue ;        // Не наш фин. инструм
         if ( OrderType ( ) > 1 )                      // Попался отложенный
           {
             Alert ( "Обнаружен отложенный ордер. Эксперт не работает." ) ;
             return ;                              // Выход из start()
           }
         if ( OrderType ( ) = = OP_BUY )
           {
            BuyTotalOp + + ;                          // Счётчик ордеров Buy
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
   //Проверка если открыто несколько БАЙ-позиций
   if ( OrderType ( ) = = OP_BUY & & BuyTotalOp > 1 )          // Тип ордера бай и ордеров по циклу "с начала" = 1
     {
//....................................     
       //---- если условия закрытия нескольких лотов БАЙ
       if ( BuyOrdProf > 0 )
         {
         //---- закрываем 1-ю часть позиции
         Alert ( "Попытка закрыть Buy " , TicketCl , ". Ожидание ответа.." ) ;
         RefreshRates ( ) ;                              // Обновление данных
         Ans = OrderClose ( CloseTicketCl , Lots , Bid , 0 , Red ) ;            // Закрытие Buy
         if ( Ans = = true )                              // Получилось :)
           { 
             Alert ( "Закрыт ордер Buy " , TicketCl ) ;
             break ;                                    // Выход из цикла закр
           }
         if ( Fun_Error ( GetLastError ( ) ) = = 1 )            // Обработка ошибок
             continue ;                                // Повторная попытка
         return ;                                      // Выход из start()
         }
     }
//.........................................
   //Проверка если открыта одна БАЙ-позиция
   if ( OrderType ( ) = = OP_BUY & & BuyTotalOp = = 1 )          // Тип ордера бай и ордеров по циклу "с начала" = 1
     {
//....................................     
       //---- если условия закрытия одного лота БАЙ
       if ( BUYCLOSE_1PART & & BuyClLot = = Lots )
         {
         //---- закрываем 1-ю часть позиции
         Alert ( "Попытка закрыть Buy " , TicketCl , ". Ожидание ответа.." ) ;
         RefreshRates ( ) ;                              // Обновление данных
         Ans = OrderClose ( CloseTicketCl , LotCloseBuy / 3 , Bid , 0 , Red ) ;            // Закрытие Buy
         if ( Ans = = true )                              // Получилось :)
           { 
             Alert ( "Закрыт ордер Buy " , TicketCl ) ;
             break ;                                    // Выход из цикла закр
           }
         if ( Fun_Error ( GetLastError ( ) ) = = 1 )            // Обработка ошибок
             continue ;                                // Повторная попытка
         return ;                                      // Выход из start()
         }
 

Aslında, her iki lotu da kapatma koşulları göründüğünde, ilkinin tamamen kapandığı ve ikincisinin BuyTotalOp==1 kapatma koşullarını "üstlendiği" ve kendi koşullarına göre kapandığı ortaya çıkıyor.

Kapanış koşullarında neyin yanlış olduğunu ve her iki partiyi aynı anda kapanmaya nasıl zorlayacağınızı söyleyin? Şimdiden teşekkürler.

 
Sipariş döngüsüne saymak ve eklemek için hem OrderTicket () hem de Lots denedim - boşuna ... Belki, her zaman olduğu gibi, "gerçek yakınlarda bir yerdedir", ancak yakalanmadı ...
 

sinekleri pirzolalardan ayırın.. bazı faydalı fonksiyonlar yazın..

örneğin, açık emirlerin sayısını emir tipine göre sayma, emir tipine göre kapatma emirleri vb.

o zaman her şey daha kolay olacak.

 if ( ordersTotal ( SYMBOL , OP_BUY ) = = 1 ) closeAllOrders ( SLIPPAGE , TRY , TRADESLEEP , SHOWERRORS , SYMBOL , OP_BUY ) ;
if ( ordersTotal ( SYMBOL , OP_BUY ) > 1 ) closeAllOrders ( SLIPPAGE , TRY , TRADESLEEP , SHOWERRORS , SYMBOL , OP_BUY ) ;

aksi halde yeterince yeriniz yok } ve tam olarak ne yapıldığı genellikle belirsiz hale geliyor .. aynı anda siparişlerin sayısını saymaya ve onları hemen silmeye mi çalışıyorsunuz, yoksa ne? bekleyen siparişler, varsa kodu kesmek yerine atlamak mantıklı olabilir mi?

iyi bir seçenek, verilen koşullara göre, onları kapatabileceğiniz açık siparişlerin parametreleriyle bir dizi oluşturacak bir işlev olacaktır .. genel olarak yapı üzerinde çalışın ..

 

Teşekkürler keekkenen, son zamanlarda bir dizi oluşturmayı düşünüyordum. Onunla hiç çalışmadım ve daha basit bir çözüm olduğunu, zaten "göz kırpan" bir görünüme sahip olduğumu ve yeni gözleri olan birinin baktıktan sonra "evet, Noel ağaçları, ama nerede böyle ve böyle" diyeceğini umdum. bir hesap...." Sonuçta, bir döngüdeki tüm satın alma siparişlerinin bir sayısı vardır:

   // Учёт количества имеющихся ордеров от начала к концу
   Symb = Symbol ( ) ;                                // Название фин.инстр.
   BuyTotalOp = 0 ;                                  // Количество Buy ордеров
   SellTotalOp = 0 ;                                // Количество Sell ордеров
   for ( int i = 1 ; i < = OrdersTotal ( ) ; i + + )          // Цикл перебора ордер
       {
       if ( OrderSelect ( i - 1 , SELECT_BY_POS ) = = true ) // Если есть следующий
         {                                        // Анализ ордеров:
         if ( OrderSymbol ( ) ! = Symb ) continue ;        // Не наш фин. инструм
         if ( OrderType ( ) > 1 )                      // Попался отложенный
           {
             Alert ( "Обнаружен отложенный ордер. Эксперт не работает." ) ;
             return ;                              // Выход из start()
           }
         if ( OrderType ( ) = = OP_BUY )
           {
            BuyTotalOp + + ;                          // Счётчик ордеров Buy
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

ve OrderClose onları takip etmiyor ...

   //Проверка если открыто несколько БАЙ-позиций
   if ( OrderType ( ) = = OP_BUY & & BuyTotalOp > 1 )          // Тип ордера бай и ордеров по циклу "с начала" = 1
     {
//....................................     
       //---- если условия закрытия нескольких лотов БАЙ
       if ( BuyOrdProf > 0 )
         {
         //---- закрываем 1-ю часть позиции
         Alert ( "Попытка закрыть Buy " , TicketCl , ". Ожидание ответа.." ) ;
         RefreshRates ( ) ;                              // Обновление данных
         Ans = OrderClose ( CloseTicketCl , BuyTotalOp , Bid , 0 , Red ) ;            // Закрытие Buy
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Evet, bu açıkça "aşırı bilgelik" .......
 

Ve dürüst olmak gerekirse, bunu anlamıyorum.

Ans = OrderClose ( CloseTicketCl , Lots , Bid , 0 , Red ) ;            // Закрытие Buy

ve bu, özellikle partinin 3'e bölünmesi ?? Sipariş açıldığı gibi aynı lot ile kapatılır.

Ans = OrderClose ( CloseTicketCl , LotCloseBuy / 3 , Bid , 0 , Red ) ;            // Закрытие Buy

neden her iki durumda da olmasın?

Ans = OrderClose (OrderTicket() ,OrderLots() ,OrderClosePrice() , 0 , Red ) ;            // Закрытие Buy
 

neden her iki durumda da olmasın?

Ans = OrderClose (OrderTicket() ,OrderLots() ,OrderClosePrice() , 0 , Red ) ;            // Закрытие Buy

CloseTicketCl = OrderTicket () genel olarak bunu yapabilirsiniz...

ve bu, özellikle partinin 3'e bölünmesi ?? Sipariş açıldığı gibi aynı lot ile kapatılır.

 Ans = OrderClose ( CloseTicketCl , LotCloseBuy / 3 , Bid , 0 , Red ) ;            // Закрытие Buy

aynı değil. Partinin üçte biri kapandı (koşullardan birine göre - fiyatın +150 puana ulaştığını varsayalım). İkinci üçte biri, örneğin açılıştan +300 pp olduğunda vb. kapanacaktır.

Ve dürüst olmak gerekirse, bunu anlamıyorum.

 Ans = OrderClose ( CloseTicketCl , Lots , Bid , 0 , Red ) ;            // Закрытие Buy
burada Çok ve OrderLots() evet, aynı şey.
 
hope >> : aynı değil. Partinin üçte biri kapandı (koşullardan birine göre - fiyatın +150 puana ulaştığını varsayalım). İkinci üçte biri, örneğin açılıştan +300 pp, vb. olduğunda kapanacaktır.

hayır, bu işe yaramaz.. bir sipariş - bir lot, lot 3 ile bir sipariş açarsanız, lotu istediğiniz gibi bölemezsiniz - önce 1, sonra 1 ve sonra 1 - sipariş tamamen kapanır , yani sipariş açılan lot ile kapatılır, siparişleri parça parça kapatamazsınız..