Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz, hiçbir yerde - 6. - sayfa 123

 
nick_travel :

Güzel gün!

Lütfen yardım edin ve danışmanın neden ticaret yapmadığını açıklayın?

Belki yemek yemek istiyordur? Maaş bekliyorum...
 
hoz :


Evet, bu arada, bu uyum uygulamada daha yetkin. Eşlik eden işlevin başlangıcındaki akım daha fazla yer kaplamaya başladı. Şu şekilde çıktı:

Optimize edilecek bir şey yok gibi görünüyor, değil mi?

Demek istediğim, başlangıçta çok az şey olduğunda çok daha uygun. Ve her şey tamamen işlevlerle çağrılır. Ve en son, başlangıçta, ana işlevlerde çok sayıda büyüme olduğu ve ek işlevler arandığı ortaya çıktı ...

Ve fonksiyonda global olarak bildirilen bir dizinin adını kullanıyorsak, neden bir diziyi referans olarak iletiyoruz? Bunu şöyle koyabilirsiniz:

 void FindOrders( int & massive [])
{
   int oType;
   ArrayInitialize ( massive , 0 );
   for ( int i= OrdersTotal () - 1 ; i>= 0 ; i--)
   {
       if (! OrderSelect (i,SELECT_BY_POS,MODE_TRADES)) continue ;
       if (OrderSymbol() != Symbol ()) continue ;
       if (OrderMagicNumber() != i_magic) continue ;
      
      oType = OrderType();
      massive [oType] = massive [oType] + 1 ;
   }
}

Evet ve mona'yı biraz kısaltın:

 void FindOrders( int & massive [])
{
   ArrayInitialize ( massive , 0 );
   for ( int i= OrdersTotal () - 1 ; i>= 0 ; i--)
   {
       if (! OrderSelect (i,SELECT_BY_POS,MODE_TRADES)) continue ;
       if (OrderSymbol() != Symbol ()) continue ;
       if (OrderMagicNumber() != i_magic) continue ;
      
      massive [OrderType()] = massive [OrderType()] + 1 ;
   }
}

Ve baştan arama ve mesajların çıktısı hakkında. Bana öyle geliyor ki, orada bir şeyler ters gitti. pr() işlevi görünmüyor, bu nedenle önerilecek bir şey yok ...

Evde, test cihazındaki siparişlerin sayısını kontrol etmek için bunu çok düşünmeden çabucak yaptım:

   FindOrders(mn0, OrdersMassive);

   Comment ( "\n" + "Всего ордеров = " + OrdersTotal ()+
             "\n" + "Количество " +GetNameOP( 0 )+ " = " +OrdersMassive[ 0 ]+
             "\n" + "Количество " +GetNameOP( 1 )+ " = " +OrdersMassive[ 1 ]+
             "\n" + "Количество " +GetNameOP( 2 )+ " = " +OrdersMassive[ 2 ]+
             "\n" + "Количество " +GetNameOP( 3 )+ " = " +OrdersMassive[ 3 ]+
             "\n" + "Количество " +GetNameOP( 4 )+ " = " +OrdersMassive[ 4 ]+
             "\n" + "Количество " +GetNameOP( 5 )+ " = " +OrdersMassive[ 5 ]
            );

Tüm çıktıyı, dizideki verileri okuyacak ve insan benzeri nesnelerde bilgileri görüntüleyecek bir işleve sarabilirsiniz.

 
nick_travel :

Güzel gün!

Lütfen yardım edin ve danışmanın neden ticaret yapmadığını açıklayın?


Çünkü tüm telepatlar ve tüm görücüler burada değil!
 

Anlaşılır şekilde!

Belki de hangi ayarların veya başka bir şeyin gerekli olduğu gerçeğinden bahsediyorum?

 
artmedia70 :

Ve fonksiyonda global olarak bildirilen bir dizinin adını kullanıyorsak, neden bir diziyi referans olarak iletiyoruz? Bunu şöyle koyabilirsiniz:

 void FindOrders( int &massive[])
{
   int oType;
   ArrayInitialize (massive, 0 );
   for ( int i= OrdersTotal () - 1 ; i>= 0 ; i--)
   {
       if (! OrderSelect (i,SELECT_BY_POS,MODE_TRADES)) continue ;
       if (OrderSymbol() != Symbol ()) continue ;
       if (OrderMagicNumber() != i_magic) continue ;
      
      oType = OrderType();
      massive[oType] = massive[oType] + 1 ;
   }
}

Aslında, evet, mantıklı. Akım burada da referansla geçiliyor.. :)) Parametrelerin global olmadığı son seferden sonra bırakmıştım.

Ve pr işlevi hakkında. İşte burada:

 //+-------------------------------------------------------------------------------------+
//| Распринтовка на экран                                                               |
//+-------------------------------------------------------------------------------------+
void pr ( string txt)
{
   string info [];
   ArrayResize (info, 20 );
   string h, m, s, cm; int i;
   
   h = DoubleToStr(Hour(), 0 );     if ( StringLen (h) < 2 ) h = "0" + h;
   m = DoubleToStr(Minute(), 0 );   if ( StringLen (m) < 2 ) m = "0" + m;
   s = DoubleToStr(Seconds(), 0 ); if ( StringLen (s) < 2 ) s = "0" + s;
   txt = h + ":" + m + ":" + s + " - " + txt;
   
   for (i= 20 - 1 ; i>= 1 ; i--)
   info[i] = info[i- 1 ];
   info[ 0 ] = txt;
   
   for (i= 20 - 1 ; i>= 0 ; i--)
   if (info[i] != "" )
   {
      cm = info[i];
       ObjectCreate ( "txtw" +i, OBJ_LABEL , 0 , 0 , 0 );
      ObjectSet    ( "txtw" +i, OBJPROP_CORNER , 1 );
      ObjectSet    ( "txtw" +i, OBJPROP_XDISTANCE , 10 );
      ObjectSet    ( "txtw" +i, OBJPROP_YDISTANCE , 30 + 15 *i);
      ObjectSetText( "txtw" +i, cm, 10 , "Times New Roman" , Green);
   }
}
 
nick_travel :

Anlaşılır şekilde!

Belki de hangi ayarların veya başka bir şeyin gerekli olduğu gerçeğinden bahsediyorum?


Ve burada neredeyse hiç telepat olmadığı gerçeğinden bahsediyorum ve eğer varsa, onları bu tür yeteneklere ilgi duymaya çalışın .. Tahmin Et ve Yardım et ...

 
hoz :


Ve burada neredeyse hiç telepat olmadığı gerçeğinden bahsediyorum ve eğer varsa, onları bu tür yeteneklere ilgi duymaya çalışın .. Tahmin Et ve Yardım et ...

Ya da belki piyasaya yanlış girişe izin vermeyen çok iyi bir sistem! Bunu isterdim!
 

Gerekli pozisyonların kapanması ile burada bir stoperim var. İşin özü şu:

1. Pozisyonların kapanması takip edilir.

2. Son alım pozisyonu kapanır kapanmaz... tüm açık ve bekleyen pozisyonları aynı anda kapatmanız gerekir. Tümünü lotlara göre kapatır, yani. hemen büyük partiler ve ardından daha küçük partiler. Durum tamamen emirlerle deneyim kazanmak içindir.

Uygulama şu şekildedir:

start() içinde her kene üzerinde:

 for (int ord=OrdersTotal()-1; ord>=0; ord--)
   {
      if (!OrderSelect(ord,SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() == 6) continue;
        
      g_ticket = OrderTicket();
      g_type = OrderType();
              
      // Блок модификации ордеров       
      if (i_sl != 0 || i_tp != 0)
      {
         if (OrderStopLoss() == 0 && OrderTakeProfit() == 0)
         {
            OrdersModifyer(g_ticket);
         }
      }
      // Закрытие всех ордеров, если последний ордер закрыт
      if (isCloseByTakeLastOpenPos(2))
      {
         // if (g_type < 2)
          {
              ClosePosBySortLots();
          }
          //else
          if (g_type > 1)
          {
              DeletePendingOrders(g_ticket);
          }
      }
   }

Piyasa emirlerini kapatmakla ilgilenmiyoruz, çünkü gerektiği gibi ertelenen kaldırılır. İşte sahip olduklarımız:

 //+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
bool isCloseByTakeLastOpenPos( int delta)
{
   datetime lastOrderCloseTime = - 1 ,               // Время закрытия последнего открытого ордера
            lastOOTHist = - 1 ;                     // Время открытия последнего открытого ордера из истории
   int j = - 1 ;
   pr ( "Запустилась функция isCloseByTakeLastOpenPos" );
   
   for ( int i=OrdersHistoryTotal()- 1 ; i>= 0 ; i--)
   {
       if (! OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) continue ;
       if (OrderMagicNumber() != i_magic) continue ;
       if (OrderSymbol() != Symbol ()) continue ;
       if (OrderType() > 1 ) continue ;               // Все удалённые отложки нас не интересуют..
  
       if (lastOrderCloseTime < OrderCloseTime())   // Находим время закрытия..
      {
         lastOrderCloseTime = OrderCloseTime();   // ..последней закрытой позиции в истории
         j = i;
         pr ( "j = " + j + "   " + TimeToStr( TimeCurrent ()));
      }
   }
   if ( OrderSelect (j, SELECT_BY_POS, MODE_HISTORY))
   {
       if (OrderProfit() + OrderCommission() + OrderSwap() <= 0 ) return ( false );
//      pr ("OTP() = " + OrderTakeProfit() + "; OCP() " + OrderClosePrice() + "   " + TimeToStr(TimeCurrent()));
   //    pr ("OOP() = " + OrderOpenPrice() + "; OCP() " + OrderClosePrice() + "   " + TimeToStr(TimeCurrent()));
       if ( MathAbs (OrderTakeProfit() - OrderClosePrice()) > delta * pt) return ( false );
       else
      {
         lastOOTHist = OrderOpenTime();
         Comment ( "\n" , "FUNC isCloseByTakeLastOpenPos: " ,
                 "\n" , "j = " , j,
                 "\n" , "lastOOTHist = " , TimeToStr(lastOOTHist, TIME_SECONDS));
      }
   }
   else
   {
       Comment ( "\n" , "FUNC isCloseByTakeLastOpenPos: " ,
               "\n" , "j = " , j,
               "\n" , "не удалось выбрать ордер в истории" );
       return ( false );
   }
  
   for ( int h= OrdersTotal ()- 1 ; h>= 0 ; h--)
   {
       if ( OrderSelect (h, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderMagicNumber() != i_magic)   continue ;
         if (OrderSymbol() != Symbol ())       continue ;
         if (OrderType() > 1 )                 continue ;
         if (lastOOTHist < OrderOpenTime()) return ( false );   // Выбранная рыночная позиция открыта позже закрытой по тейку
      }
       else { Print ( "FUNC isCloseByTakeLastOpenPos : не удалось выбрать рыночный ордер" ); return ( false );}
   }
   
   return ( true );
}

 //+-------------------------------------------------------------------------------------+
//| Закрытие ордеров, отсортированных по размеру лотов                                  |
//+-------------------------------------------------------------------------------------+
void ClosePosBySortLots()
{
   double a[][ 2 ];
   int p = 0 ;
   
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
   {
       if (! OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) continue ;
       if (OrderMagicNumber() != i_magic) continue ;
       if (OrderSymbol() != Symbol ()) continue ;
       if (OrderType() < 2 )
      {
         p++;
         ArrayResize (a, p);
         a[p- 1 ][ 0 ] = OrderLots();
         a[p- 1 ][ 1 ] = OrderTicket();
      }
   }
   pr ( "ClosePosBySortLots(): " + "p = " + p);
   if (p > 0 )
   {
       ArraySort (a, WHOLE_ARRAY , 0 , MODE_DESCEND);
       for (i= 0 ; i<p; i++)
      {
         if ( OrderSelect (a[i][ 1 ], SELECT_BY_TICKET, MODE_TRADES))
         {
             if (OrderCloseTime() == 0 ) ClosePosBySelect();
         }
      }
   }
}
//+-------------------------------------------------------------------------------------+
//| Закрытие одного, предварительно выбранного ордера                                   |
//+-------------------------------------------------------------------------------------+
void ClosePosBySelect()
{
   bool    fc;
   color   clClose, clCloseBuy = Blue, clCloseSell = Red;
   double ll, pa, pb, pp;
   int     err, it, NumberOfTry = 3 ;

   if (OrderType() == OP_BUY || OrderType() == OP_SELL)
   {
       for (it= 1 ; it<=NumberOfTry; it++)
       {
           while (!IsTradeAllowed()) Sleep ( 5000 );
           RefreshRates();
           pa = MarketInfo(OrderSymbol(), MODE_ASK);
           pb = MarketInfo(OrderSymbol(), MODE_BID);
           if (OrderType() == OP_BUY)
           {
               pp = pb; clClose = clCloseBuy;
           }
           else
           {
               pp = pa; clClose = clCloseSell;
           }
           ll = OrderLots();
           fc = OrderClose(OrderTicket(), ll, pp, 30 , clClose);
           if (fc)
           {
               break ;
           }
           else
           {
               err = GetLastError ();
           }
       }
   }
   else Print ( "Некорректная торговая операция. Close " );
}

Bazı siparişler nedense kapatılmıyor. Neyin net olmadığı değil, ne zaman bazı bölümleri yazdırırım. Örneğin:

Yorumda, lastOOTHist = 01:30:00 olduğunu görebilirsiniz, ancak aslında bu doğru değildir. Ne de olsa, son kapatılan siparişler, sonuç penceresinde silip süpürürseniz şunu göreceğiz:

kapanış saatleri farklı...

Burada sorun ne?

 
hoz :

Aslında, evet, mantıklı. Akım burada da referansla geçiliyor.. :)) Parametrelerin global olmadığı son seferden sonra bırakmıştım.

Dizinin buraya referans olarak iletilmesi gerektiğini savundum. Aksi takdirde, işlev yalnızca bir sabit kodlanmış diziyle çalışmaya mahkumdur. Global olarak ayarlanmasına izin verin.
 

Yazık ki haftanın sonunda aldı ama ben soracağım.

Bilinen bir göndericiden gelen bir posta kutusundaki bir mesajı okumak için bir kodla deneyimi olan var mı?