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

 
hoz :

7.43 yatağa gitmediyse .. Öyleyse, kâsenin yazıldığını varsayacağım!

Hayır neden böyle küfür edersin :)) Yusuf Kâse'yi benim için yarattı. Bavullarımda oturuyorum cennetten man bekliyorum Maldivlere gideceğim :))

 
artmedia70 :
Pekala, bana orada ne yaptığını göster... Burada telepat yok - onlar tatilde.

 extern string time1 = "n" ; // 
extern string time2= "m" ;
extern double lot= 0.2 ; // объявили лот
extern int slippage= 2 ; // объявили макс отклонение от цены





int start()
{
double max; // максимальная цена 6-ти свечей
double min; // минимальная цена 6-ти свечей
int hour1 = TimeHour(StrToTime(time1)); // время часы
int minute1 = TimeMinute(StrToTime(time1)); // время минуты


if (hour1 == TimeHour( TimeCurrent ()) && minute1 == TimeMinute( TimeCurrent ())) // если время подошло то
{
min=Low[iLowest( Symbol (), 0 ,MODE_LOW, 6 , 1 )]; // вычисляем минимальную цену последних 6 свечей
max=High[iHighest( Symbol (), 0 ,MODE_HIGH, 6 , 1 )]; // вычисляем максимальную цену последних 6 свечей
double volum=max-min; // общий объем локалки последних 6 свечей М5
 int ticket1=- 1 ;
 int ticket2=- 1 ;
if ((volum<= 0.0018 )== true ) // если объем свечей меньше или равно z пунктов 

if (ticket1< 0 )
{ 
OrderSend ( Symbol (), OP_BUYSTOP, lot,max+ Point , 3 ,min- Point ,max+ 0.0022 , NULL , 0 ,time2, Red);
Alert ( GetLastError ());
}
if (ticket2< 0 )
{
OrderSend ( Symbol (), OP_SELLSTOP, lot,min- Point , 3 ,max+ Point ,min- 0.0022 , NULL , 0 ,time2, Yellow);
Alert ( GetLastError ());
}


return ;


if ( OrderSelect ( 1 ,SELECT_BY_POS,MODE_HISTORY)) ///если первый открытый ордер закрылся с профитом 
if (OrderProfit()> 0 )
{
OrderDelete(OrderTicket()); // удаляем второй отложенный
}

}



bool closeorder; //определим переменную закрытия ордеров
closeorder= true ;

if (closeorder== true ) // вечернее закрытие всех отложенных ордеров, и рыночных позиций
{
int hour2 = TimeHour(StrToTime(time2)); // вычисляем время закрытия ордеров
int minute2 = TimeMinute(StrToTime(time2));

if (hour2 == TimeHour( TimeCurrent ()) && minute2 == TimeMinute( TimeCurrent ())) // если время ***
{ // определяем количество открытых позиций, и отложенных ордеров
for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
 if ( OrderSelect ( 1 ,SELECT_BY_POS,MODE_TRADES)) break ; //определяем место где будем искать ( рабочие позиции)
if (OrderType()==OP_BUY ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),slippage); // Закрытие ордера бай если такой есть
if (OrderType()==OP_SELL) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),slippage); //Закрытие ордера селл если такой есть
if (OrderType()==OP_BUYSTOP)
{ 
OrderDelete(OrderTicket()); //удаляем отложенный байстоп
}                    
if (OrderType()==OP_SELLSTOP)
{ 
OrderDelete(OrderTicket()); //удаляем отложенный sellstop
}                    

Danışmanın genel kodunu attım ki ne yapması gerektiği daha net anlaşılsın.
Nerede aptal olduğunu sana tekrar söyleyeceğim
açık gecikme: tam tersi olmadan bir gecikme veya bir yönde bir dizi gecikme açar.
Emirlerin silinmesi: her seferinde, bazen normalde akşamları açıkça belirtilen bir saatte ve bazen iki günde bir sorunsuz bir şekilde siler veya hiç kapanmaz ..

Pekala, durum şu:
İlk açık bekleyen bir kârla kapanırsa, ikincisini hemen sileriz - Ben de doğru yazdığımdan şüpheliyim, ancak iş yerinde kontrol edemiyorum çünkü iki zıt pozisyon açmak istemiyorum = ((((((
 
artmedia70 :
Son kapatılanı ararken, ilk önce en son kapatılanı bulmanız gerekir, ancak alım yoluyla kapanışı kontrol etmek döngünün dışına çıkarılmalıdır, aksi takdirde her bir kapalı siparişi alımla kapatma için kontrol eder ve, eğer öyleyse, döngüye yakalanan ilkinin zamanını hatırlar, en geç değil, alarak kapatılır.


Peki, bu kod optimizasyonu . Gördüğüm kadarıyla sonuç bundan değişmeyecek. Sadece hesaplamak daha uzun sürecek. Kodu düzelttim ama aynı şekilde çalışıyor..

 //+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
datetime GetLastOrderState()
{
   datetime lastOrderCloseTime = - 1 ,               // Время закрытия последнего открытого ордера
            lastOOTMarket = - 1 ,           // Время открытия последнего открытого ордера рыночного
            lastOOTHist = - 1 ;             // Время открытия последнего открытого ордера из истории
   
   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();   // ..последней закрытой позиции в истории
       Comment ( "Время закрытия последнего ордера в истории lastOrderCloseTime = " , lastOrderCloseTime);
   }

   if ( MathAbs (OrderTakeProfit() - OrderOpenPrice()) < i_tp * pt) return ( 0 );
       Comment ( "OrderTakeProfit() - OrderOpenPrice() < i_tp * pt = " , MathAbs (OrderTakeProfit() - OrderOpenPrice()) < i_tp * pt);
   lastOOTHist = OrderOpenTime();   // Тогда время открытия последней закрытой позиции из истории
       Comment ( "Время закрытия последнего ордера в истории lastOOTHist = " , lastOOTHist);
   
       Comment ( "Время открытия последнего открытого ордера = " , lastOOTHist);
  
   for ( int h= OrdersTotal ()- 1 ; i>= 0 ; i--)
   {   
       if (! OrderSelect (h, SELECT_BY_POS, MODE_TRADES)) continue ;
       if (OrderMagicNumber() != i_magic) continue ;
       if (OrderSymbol() != Symbol ()) continue ;
      {
         if (lastOOTMarket < OrderOpenTime())
             lastOOTMarket = OrderOpenTime();
  
         if (lastOOTMarket < lastOOTHist)       // Если время открытия последнего открытого ордера (рыночного) ниже последнего открытого ордера из истории..
             lastOrderCloseTime = OrderCloseTime(); // Значит это искомый ордер
      }
   }

   Comment ( "Время закрытия последнего открытого ордера = " , lastOrderCloseTime);
   return (lastOrderCloseTime);
}

Yine de, sanki içinde bir tür söve var.

 
ex1m :

Danışmanın genel kodunu attım ki ne yapması gerektiği daha net anlaşılsın.
Sana nerede aptal olduğunu tekrar söyleyeceğim
açık gecikme: tam tersi olmadan bir gecikme veya bir yönde bir dizi gecikme açar.
Emirlerin silinmesi: her seferinde, bazen normalde akşamları açıkça belirtilen bir saatte ve bazen iki günde bir sorunsuz bir şekilde siler veya hiç kapanmaz ..

Pekala, durum şu:
İlk açık bekleyen bir kârla kapanırsa, ikincisini hemen sileriz - Ben de doğru yazdığımdan şüpheliyim, ancak iş yerinde kontrol edemiyorum çünkü iki zıt pozisyon açmak istemiyorum = ((((((



Soruya soruyla cevap vereceğim. Bu ne:

 if ((volum<= 0.0018 )== true ) // если объем свечей меньше или равно z пунктов 

Anlat bana anlamadım :)

Bir pozisyon açma kontrolleri, bir pozisyon açma girişiminden sonra yapılmalıdır. Onlar.

 if (ticket1< 0 )

Arama emrini gönderdikten sonra yerleştirirsiniz.

Gecikme açmak için fiyatın sırasıyla Sor veya Bid'den daha yüksek veya daha düşük olması gerekir. Bunun gibi körfez için:

 if (OOP > Ask)
 
hoz :


Peki, bu kod optimizasyonu. Sonuç, gördüğüm kadarıyla bundan değişmeyecek. Sadece hesaplamak daha uzun sürecek. Kodu düzelttim ama aynı çalışıyor..

Yine de, sanki içinde bir tür söve var.

Hayır, bu sadece kod optimizasyonu değil. Bu sadece ikincisinin arayışıdır. Tüm kapatılan siparişlerin sayımını tamamladığınızda ve bunların en son kapatılanını bulduğunuzda, ancak bundan sonra kapanış için kontrol etmeniz gerekir ve eğer öyleyse, alma ile kapatılır, ancak o zaman aramaya devam etmek mantıklıdır. dinlenmek için.

Döngünün içine alma ile kapanış kontrolünü koyarsak, ne elde ederiz? Bir mantık hatası alıyoruz:
Diyelim ki bir yıl önce kapatılmış bir sipariş seçtiniz. Her durumda, süresi -1'den büyük olacaktır, bu da onu bir çekimle kapatmak için kontrol ettiğimiz anlamına gelir (sonuçta bu kontrol döngü içindeki koddadır). Evet, alımla kapandı... İşleviniz bundan sonra ne yapacak? Bu doğru - bununla çalışmaya devam ediyor , bir yıl önce, siparişle kapandı. Hala hataların olduğu bir yere bakacağım. Eve yeni geldim...

 

Yazıldı: 2. Son açık pozisyon alımla kapatılırsa, her şeyi kapatın!

Pekala, bunun gibi bir anlama geliyor:

 //-----------------------------------------------------------------------------------------------+
bool isCloseByTakeLastOpenPos ( string sy, int mn, int delta) {
   datetime t= 0 ;
   int    i, k, j=- 1 ;
   
// Сначала определим, что последняя закрытая позиция была закрыта по тейку (в пределах дельты)
   k=OrdersHistoryTotal()- 1 ;
   for (i=k; i>= 0 ; i--) {
       if ( OrderSelect (i,SELECT_BY_POS,MODE_HISTORY)) {
         if (OrderMagicNumber()!=mn)   continue ;
         if (OrderSymbol()!=sy)         continue ;
         if (OrderType()> 1 )             continue ;             // Сначала забыл вписать, подправил
         if (t<OrderCloseTime()) {t=OrderCloseTime(); j=i;}
         }
      }  
   // Нашли последнюю. Проверим её закрытие по тейку
   if ( OrderSelect (j,SELECT_BY_POS,MODE_HISTORY)) {                      
       if (OrderProfit()+OrderSwap()+OrderCommission()<= 0 )   return ( false );           // Закрыта с убытком или в ноль
       if ( MathAbs (OrderTakeProfit()-OrderClosePrice())>delta* Point ) return ( false );   // закрыта в профите, но не в пределах дельты
       else t=OrderOpenTime();     // Если последняя закрытая была закрыта по тейку (в пределах дельты), запомним время её открытия
      }
   else { Print ( "FUNC isCloseByTakeLastOpenPos : не удалось выбрать ордер в истории" ); return ( false );}
// Здесь мы имеем последнюю закрытую позицию в профите и закрытую по тейку (в пределах дельты), ищем дальше
   k= OrdersTotal ()- 1 ;
   for (i=k; i>= 0 ; i--) {
       if ( OrderSelect (i,SELECT_BY_POS)) {
         if (OrderMagicNumber()!=mn)   continue ;
         if (OrderSymbol()!=sy)         continue ;
         if (OrderType()> 1 )             continue ;
         if (t<OrderOpenTime()) return ( false );   // Выбранная рыночная позиция открыта позже закрытой по тейку
         }
       else { Print ( "FUNC isCloseByTakeLastOpenPos : не удалось выбрать рыночный ордер" ); return ( false );}
      }
   return ( true );   // Найденная закрытая по тейку позиция была открыта позже всех, возвращаем её время открытия
}
//-----------------------------------------------------------------------------------------------+

Kontrol etmek istediğimiz sembolü, büyü ve delta (nokta olarak mesafe == emir alımı ile kapanış fiyatı arasındaki fark) fonksiyona aşağıdaki gibi iletiyoruz:

   if (isCloseByTakeLastOpenPos ( Symbol (), Magic, 5 )) { // Если последняя открытая была закрыта по тейку ...
       // ... тут обрабатываем эту ситуёвину
      }
   else {   // Иначе ...
       // тут обрабатываем, если последняя закрытая была открыта не последней или ...
       // ... последняя закрытая была закрыта с убытком или в профите, но за пределами дельты
      }

Fonksiyonu kontrol etmedim dizimin üstüne yazdım. Yani hataları aramak size kalmış.

Bunu int yapabilir ve dönüş kodlarını kullanabilirsiniz. Örneğin, istenen pozisyon yoksa veya mevcutsa, ancak zararda kapatılırsa, -1'i döndürün,
varsa ve kârla kapatılırsa, ancak delta içinde değilse, 0 döndürür;
varsa ve kârla ve alımla (delta dahilinde) kapatılırsa, 1...

Hayal gücünün kapsamı çok büyük ...

 
artmedia70 :

Döngünün içine alma ile kapanış kontrolünü koyarsak, ne elde ederiz? Bir mantık hatası alıyoruz:

Diyelim ki bir yıl önce kapatılmış bir sipariş seçtiniz. Her durumda, süresi -1'den büyük olacaktır, bu da onu bir çekimle kapatmak için kontrol ettiğimiz anlamına gelir (sonuçta bu kontrol döngü içindeki koddadır). Evet, tik üzerinde kapalı ..


Yani döngü tüm siparişlerdeyse, her durumda döngü tüm siparişlerden geçecektir. Her siparişin kapanış zamanı, seçilen bir önceki siparişle karşılaştırılacaktır. Sadece burada performans ile cant geliyor. Çünkü Kâr al, yalnızca sonuncusu için değil, her kapalı pozisyon için döngüde sürekli olarak kontrol edilecektir. Böyle !?
 
PapaYozh :

Böyle.

Ama açılış fiyatı ile Open[] var.


Anladım, teşekkürler :)
 
hoz :

Yani döngü tüm siparişlerdeyse, her durumda döngü tüm siparişlerden geçecektir. Her siparişin kapanış zamanı, seçilen bir önceki siparişle karşılaştırılacaktır. Sadece burada performans ile cant geliyor. Çünkü kar al, sadece sonuncusu için değil, her kapalı pozisyon için döngüde sürekli olarak kontrol edilecektir. Böyle !?
Ben zaten bir örnek fonksiyon yazdım.
 
hoz :

Yani döngü tüm siparişlerdeyse, her durumda döngü tüm siparişlerden geçecektir. Her siparişin kapanış zamanı, seçilen bir önceki siparişle karşılaştırılacaktır. Sadece burada performans ile cant geliyor. Çünkü kar al, sadece sonuncusu için değil, her kapalı pozisyon için döngüde sürekli olarak kontrol edilecektir. Böyle !?

İşte ortak:

   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();   // ..последней закрытой позиции в истории
      
       if ( MathAbs (OrderTakeProfit() - OrderOpenPrice()) < i_tp * pt) return ( 0 ); // ЗДЕСЬ ВЫХОДИМ ПРИ ПЕРВОМ ВСТРЕЧНОМ
      
      lastOOTHist = OrderOpenTime();   // Тогда время открытия последней закрытой позиции из истории
   }
Neden: