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

 
Sepulca :

şöyle yapardım:


PS Aynı anda cevaplandı)))

Anlamadım:

 if (shift> 0 ) shift=shift- 1 ;

ilk çubukta açıksa, sıfırdan sıfıra mı bakıyoruz?

 
artmedia70 :

Anlamadım:

ilk çubukta açıksa, sıfırdan sıfıra mı bakıyoruz?


Bu, emrin açılış fiyatının açılış anında Düşük'ten önemli ölçüde yüksek olması durumunda küçük bir reasüranstır. Onlar. arama için açılış çubuğunu kullanmıyoruz. Bunun için ve PERIOD_M1.
 
Sepulca :
Bu, emrin açılış fiyatının açılış anında Düşük'ten önemli ölçüde yüksek olması durumunda küçük bir reasüranstır. Onlar. arama için açılış çubuğunu kullanmıyoruz. Bunun için ve PERIOD_M1.

başka türlü yapardım. Genelde yalnızca konum birden fazla çubuk sürdüğünde aramaya başlardım. Sonuçta, en iyi fiyat sadece açılış barında olabilir ve biz onu harcıyoruz...
 
artmedia70 :
başka türlü yapardım. Genelde yalnızca konum birden fazla çubuk sürdüğünde aramaya başlardım. Sonuçta, en iyi fiyat sadece açılış barında olabilir ve biz onu harcıyoruz...

Kabul ediyorum. Dizideki her açık emir için fiyatın diplerini (veya yükseklerini) her tikte ezberlemek ve koşula ulaşıldığında emirleri kapatmak, emrin geldiği andan itibaren tekrar düşük olanı aramak yerine muhtemelen daha verimli olacaktır. açıldı. Bunun gibi bir şey:

 ShortOrderTicket[i]= OrderSend ( Symbol (),OP_SELL,......
 if (ShortOrderTicket[i]>= 0 ) min[i]=Bid;
 //.....................................................
 //На каждом тике обновляем минимумы для каждого открытого ордера
 for (i= 0 ;i<N;i++){
   if (ShortOrderTicket[i]>= 0 ){
   min[i] =MathMin (min[i],Ask);
  }
// Если достигнуто условие, закрываем ордер
   if (Ask>min[i]+Delta) if (OrderClose(ShortOrderTicket[i],.....))ShortOrderTicket[i]=- 1 ;
 }
Peki, bağlantı kaybı, danışmanın yeniden başlatılması vb. zaman zaman siparişlerin durdurma kaybını değiştirin.
 
artmedia70 :
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.


hm. Sonuçta , çağıran işleve hangi dizinin iletildiğine bağlıdır. Belirli bir dizi varsa, çağrılan işlev onunla çalışacaktır ... Sonuçta, yani ..

Örneğin,

 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 ;
   }
}

Böyle çağırarak:

FindOrders(OrdersMassive)

OrdersMassive dizisiyle çalışma devam ediyor

Ve bu yüzden:

FindOrders(massiveOfOrders)

masifOfOrders dizisi ile

 
Bir anlaşmayı açarken yayılma boyutunu nasıl öğreneceğimi söyleyin, ancak bunun günlükte görüntülenmesi daha mı iyi?
 
Forexman77 :
Bir anlaşmayı açarken yayılma boyutunu nasıl öğreneceğimi söyleyebilir misiniz, ancak bunun günlükte görüntülenmesi daha iyi olur mu?

if (spread) == bir değer, o zaman.. bir şeyler yap... (Örneğin, bir sipariş açın veya değerini günlüğe yazdırın). Veya tam tersine, eşit değilse veya bazılarının değerinden daha fazla (daha az) ise, o zaman onu log'a çıkarır ve bir şeyler yaparız. Nasıl istersen..
 

Dün sorduğum soruyu tekrar edeceğim. Ayrı bir şube yapmak istemiyorum. Bir şey net değilse, tüm soruları cevaplayacağım.

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. Sonuçta, son kapatılan siparişler, sonuç penceresinde silip süpürürseniz şunu göreceğiz:

kapanış saatleri farklı...

Burada sorun ne?

 
hoz :


hm. Sonuçta, çağıran fonksiyona hangi dizinin iletildiğine bağlıdır. Belirli bir dizi varsa, çağrılan işlev onunla çalışacaktır ... Sonuçta, yani ..

Örneğin,

Böyle çağırarak:

OrdersMassive dizisiyle çalışma devam ediyor

Ve bu yüzden:

masifOfOrders dizisi ile


Değere göre bir işleve bir değişken (dizi) aktarırken, işlevin içinde, başlıkta bildirdiğiniz yerel bir değişken oluşturulur: MyFunct(int my_var). Bu nedenle, bu değişkendeki değişiklikler fonksiyonun dışında görülemez. Ve bir dizi durumunda, derleyici size bunu hatırlatacaktır.

Bir değişkenin değerindeki değişikliklerin dışarıda (fonksiyonun dışında) görünmesini istiyorsanız, değişkenleri referansa göre iletin: MyFunct(int & my_var)

 
hoz :


hm. Sonuçta, çağıran fonksiyona hangi dizinin iletildiğine bağlıdır. Belirli bir dizi varsa, çağrılan işlev onunla çalışacaktır ... Sonuçta, yani ..

Örneğin,

Böyle çağırarak:

OrdersMassive dizisiyle çalışma devam ediyor

Ve bu yüzden:

masifOfOrders dizisi ile

Aynen öyle. Öyleyse diyorum ki - boyut ve tür olarak eşleşen herhangi birini aktarabiliyorsanız, işlevin kendisinde belirli bir diziyi reçete etmek neden zor.