Kapanış Sorunları, Lütfen yardım edin

 

herkese merhaba
Umarım sözdizimi eskisinden daha iyidir. Geçen haftadır Codersguru'yu okuyorum.

Aşağıdaki programda herhangi bir hata olmamasına rağmen derleyici sadece bir sipariş kaydedecektir. Ama kodum onu kapatmayacak.
Program, --- ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",Blue), benim
Gördüğünüz gibi, stoploss veya kâr alma eklenmemiş. Nedeni, zaten kodlanmış bir StopLoss koşulu var ---
if(OrderTicket() == OrderOpenPrice() - (ATR*2))
{
OrderClose(OrderTicket(), OrderLots(), 3, Mavi)
Yani başka bir StopLoss eklemeye gerek yok, değil mi? TakeProfit'e kadar
Diğer sorun çözüldüğünde bunu kodlayacağım.
Kapanış koşulunu bu şekilde mi kodladım, yoksa söz diziminde yine sorun mu var?
Yardımlarınız için herkese teşekkürler ve sorunum başkalarına yardımcı olabilir,
Şerefe

-----------------------------------------------------------------+
//|                                         Opening and Closeing.mq4 |
//|                                      Copyright © 2010, Ben banta |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Ben banta"
//+------------------------------------------------------+
//|                   Closing My Way                     |
//+------------------------------------------------------+



double ATR;
double Slippage = 3 ;
double StopLoss_Buy;
double StopLoss_Sell;
double Lots= 0.4 ;
double MagicNumber;

int ticket;
int order;

//----------------- Closing Sell ---------------

int start() 
  {                                                          
     for ( int index = OrdersTotal () - 1 ; index >= 0 ; index--)                              
  {                                                               
     if ( OrderSelect (index, SELECT_BY_TICKET)                     // existing orders
&&  OrderMagicNumber()  == MagicNumber                           // with my MN    
&&  OrderSymbol()       == Symbol ())                             // with my symbol
  {                                                                                                                                                    
     if (OrderType() == OP_SELL)
    order = OrderTicket(); 
                       
     if (OrderTicket() == OrderOpenPrice() + (ATR* 2 ))     // ATR*2 above Sell. Hard Stop
  {
      OrderClose(OrderTicket(),OrderLots(), 3 , Blue );   
       Print ( "Sell order closed with Hard Stop" ); 
     }     
   else
  {
       Print ( "Error closing Sell Hard Stop" , GetLastError ()); 
   }   
//---------- Closeing Buy -------------
           
     if (OrderType() == OP_BUY) 
    order = OrderTicket(); 
    
     if (OrderTicket() == OrderOpenPrice() - (ATR* 2 ))     // ATR*2 below Buy. Hard Stop
  {
      OrderClose(OrderTicket(),OrderLots(), 3 , Red ); 
       Print ( "Buy order closed with Hard Stop" );
     }     
   else 
  {
       Print ( "Error closing Buy Hard Stop" , GetLastError ());                                      
       return ( 0 ); 
    }                                              
  } 
}


//------------ Opening Buy -----------------

if ( OrdersTotal () < 1 )                                         // Checking for any working orders
   {                                   
     if (Ask > High[iHighest( NULL , 0 ,MODE_HIGH, 20 , 1 )])         // When this condition is true, 
                                                               // with no working orders  
   {                                                                                     
        ticket= OrderSend ( Symbol (),OP_BUY,Lots,Ask,Slippage, 0 , 0 , " " , 0 , 0 , Blue );
                                                               // Buy! Useing these parameters  
     if (ticket> 0 )
   { 
       if ( OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES))                                                       
       Print ( "Buy Order Was a Big Success :" , OrderOpenPrice());
    }
   else
       Print ( "Error Opening Buy Order :" , GetLastError ()); 
       return ( 0 );                                                  
  }  
                                                      
//--------------- Opening Sell ----------------
                                                                         
   if (Bid < Low[iLowest( NULL , 0 ,MODE_LOW, 20 , 1 )])                 //When this condition is true, 
                                                               //with no working orders
    {   
      ticket= OrderSend ( Symbol (),OP_SELL,Lots,Bid,Slippage, 0 , 0 , " " , 0 , 0 , Red );  
                                                               //Sell! Useing these parameters
   if (ticket> 0 )
     {     
       if ( OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES))                                                
       Print ( "Sell Order Was a Big Success :" , OrderOpenPrice());
     }
     else
       Print ( "Error Opening Sell Order :" , GetLastError ());
       return ( 0 );
     }  
     return ( 0 ); 
  }
}
 
-----------------------------------------------------------------+
//|                                         Opening and Closeing.mq4 |
//|                                      Copyright © 2010, Ben banta |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Ben banta"
//+------------------------------------------------------+
//|                   Closing My Way                     |
//+------------------------------------------------------+



double ATR;
double Slippage = 3 ;
double StopLoss_Buy;
double StopLoss_Sell;
double Lots= 0.4 ;
double MagicNumber;

int ticket;
int order;

//----------------- Closing Sell ---------------

int start() 
  {                                                          
     for ( int index = OrdersTotal () - 1 ; index >= 0 ; index--)                              
       {                                                               
         if (
           OrderSelect (index, SELECT_BY_TICKET)                     // existing orders
           &&  OrderMagicNumber()  == MagicNumber                   // with my MN    
           &&  OrderSymbol()       == Symbol ()                     // with my symbol
           )                     
           {                                                                                                                                                    
             if (OrderType() == OP_SELL) order = OrderTicket(); 
                       
             if (OrderTicket() == OrderOpenPrice() + (ATR* 2 ))     // ATR*2 above Sell. Hard Stop
              {
               OrderClose(OrderTicket(),OrderLots(), 3 , Blue );   
               Print ( "Sell order closed with Hard Stop" ); 
              }     
               else
              {
               Print ( "Error closing Sell Hard Stop" , GetLastError ()); 
              } //ENDif (OrderTicket() == OrderOpenPrice() + (ATR*2))
                                 
                                                               //---------- Closeing Buy -------------
                     
               if (OrderType() == OP_BUY) order = OrderTicket(); 
               
               if (OrderTicket() == OrderOpenPrice() - (ATR* 2 ))     // ATR*2 below Buy. Hard Stop
                {
                 OrderClose(OrderTicket(),OrderLots(), 3 , Red ); 
                 Print ( "Buy order closed with Hard Stop" );
                }     
                 else 
                {
                 Print ( "Error closing Buy Hard Stop" , GetLastError ());                                      
                 return ( 0 ); 
                } //ENDif (OrderTicket() == OrderOpenPrice() - (ATR*2))                                              
           } //ENDIf ( OrderSelect(index, SELECT_BY_TICKET) etc
       } // END for loop               
                     
                             
                                         //------------ Opening Buy -----------------
                       
     if ( OrdersTotal () < 1 )                                         // Checking for any working orders
      {                                   
       if (Ask > High[iHighest( NULL , 0 ,MODE_HIGH, 20 , 1 )])         // When this condition is true, 
                                                               // with no working orders  
        {                                                                                     
         ticket= OrderSend ( Symbol (),OP_BUY,Lots,Ask,Slippage, 0 , 0 , " " , 0 , 0 , Blue );
                                                               // Buy! Useing these parameters  
         if (ticket> 0 )
           { 
             if ( OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ( "Buy Order Was a Big Success :" , OrderOpenPrice());
           }
           else
           Print ( "Error Opening Buy Order :" , GetLastError ()); //ENDif (ticket>0)
             
         return ( 0 );                                                  
        } //ENDif (Ask > High[iHighest(NU... etc  
                                                      
                                                             //--------------- Opening Sell ----------------
                                                                         
       if (Bid < Low[iLowest( NULL , 0 ,MODE_LOW, 20 , 1 )])                 //When this condition is true, 
                                                                     //with no working orders
          {   
           ticket= OrderSend ( Symbol (),OP_SELL,Lots,Bid,Slippage, 0 , 0 , " " , 0 , 0 , Red );  
                                                               //Sell! Useing these parameters
           if (ticket> 0 )
             {     
               if ( OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ( "Sell Order Was a Big Success :" , OrderOpenPrice());
             } //ENDif (ticket>0)
             else
             Print ( "Error Opening Sell Order :" , GetLastError ()); 
             //ENDif (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                                 
           return ( 0 );
          } //ENDif (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)])  
       return ( 0 ); 
      }//ENDif  ( OrdersTotal () < 1 )
} //ENDint start()
Kod bloklarının okunmasını kolaylaştırmalı
 
if (OrderTicket() == OrderOpenPrice() - (ATR* 2 )) 
Sipariş bileti , siparişin anahtarı olan çok büyük bir tamsayıdır (muhtemelen milyarlarca).
OOP - 2ATR bir fiyattır.
İkisi ASLA eşit olmayacak
OrderClosePrice() == demek istediyseniz, OOP-2ATR gerçek sayıları neredeyse hiçbir zaman eşitleri karşılaştırmaz. bunun yerine kullanın:
 if ( OrderClosePrice() - OrderOpenPrice()-ATR* 2 <= 0 ) //...

 OrderSelect (index, SELECT_BY_TICKET)                     // existing orders
           &&  OrderMagicNumber()  == MagicNumber                   // with my MN    
           &&  OrderSymbol()       == Symbol () 
OrderSend'iniz sihirli bir sayı ayarlamıyor
 
Ickyrus wrote >>
Kod bloklarının okunmasını kolaylaştırmalı


Evet. Haklısın. Her denemede ve sorgulamada biraz daha fazla şey öğreniyorum. Temizlik için teşekkürler. Diş tellerini uygun yerlere koyabildiğim son birkaç gün oldu. Ne kadar basit, o kadar iyi.
Şerefe
 
WHRoeder wrote >>
Sipariş bileti, siparişin anahtarı olan çok büyük bir tamsayıdır (muhtemelen milyarlarca).
OOP - 2ATR bir fiyattır.
İkisi ASLA eşit olmayacak
OrderClosePrice() == demek istediyseniz, OOP-2ATR gerçek sayıları neredeyse hiçbir zaman eşitleri karşılaştırmaz. bunun yerine kullanın:

OrderSend'iniz sihirli bir sayı ayarlamıyor


Merhaba WHRoeder
Arayıp önerilerde bulunduğunuz için teşekkür ederiz. Ancak OOP -2ATR'yi hemen anlamadığımı söylemeliyim.
OOP = OrderOpenPrice. Bu ilk başta kafamdan geçti. Açıklamanız kesinlikle doğru. == işaretine takıldım. OrderClosePrice() asla OrderOpenPrice() eksi (ATR*2) değerine eşit olamaz. Bunu yakaladığın için teşekkürler.
Bakalım önerinizi anlamış mıyım? Burada yeniden ifade edeceğim. if(OrderClosePrice()-OOP()-ATR*2 <= 0)
Bu şuna benziyor (burada keyfi rakamları kullanacağım) OCP = 1.4361, OOP = 1.4321, ATR = 20. Yani ifade şöyle görünür:
if (1.4321 - 1.4361 - (20*2) <= 0), üzgünüm ama anlamıyorum.
Belki ifadeyi yeniden düzenlemek, ne demek istediğimi göstermek için aynı rakamları kullanabilirim. Ama onları programa soktuğumda bu da işe yaramadı.
Yeni düzenleme böyle görünüyor.

eğer (1.4361 >= 1.4321 + (20*2)).

OCP >=OOP + ATR*2 olduğunda, kontrol şuraya geçer:
OrderClose (OrderTicket(), OrderLots(), vb.)

Diğer gözleminiz, OrderSend'in sihirli bir sayı belirlememesiydi.
Bu kısmı programdan çıkarabilir miyim: && OrderMagicNumber == MagicNumber,
Tekrar teşekkürler ve başka iyileştirmeler görebilirseniz minnettar olurum.
Şerefe
 

Merhaba Ayşe
Cevabınız için teşekkürler. Umarım iyisindir.
Öneri bu sabah eklendi. Derleyicinin kodladıklarımı beğenmediğini söylediğim için üzgünüm. Programdaki hangi ifadenin yanlış olduğundan emin değilim. Güzel olduğuna inandığım öneriler. Programı yeniden yayınlayacağım ve sorun olabileceğine inandığım alanı işaretleyeceğim. Kapatma stratejisini de belirteceğim.

Satış pozisyonu, Atr*2 tarafından emir açılış fiyatının üzerinde durdurulacaktır. Örneğin, OOP 1.4321, Atr =20 ve OCP = 1.4361'dir.
Bu yüzden ifadeyi şu şekilde kodladım:

if(OrderClosePrice >= OrderOpenPrice(), - (ATR*2)) // koşul karşılanır, kontrol şuraya geçer....
OrderClose (OrderTicket(), OrderLots(), OrderClosePrice(),Mavi) ;

Not: Herhangi bir ilgisi varsa, OrderSend ifadesinde StopLoss() veya TakeProfit() yoktur.

herkesin yardımları için tekrar teşekkürler
Şerefe
 double ATR;
double Slippage = 3 ;
double StopLoss_Buy;
double StopLoss_Sell;
double Lots= 0.4 ;
double MagicNumber;

int ticket;
int order;

//----------------- Closing Sell ---------------

int start() 
  {                                                          
     for ( int index = OrdersTotal () - 1 ; index >= 0 ; index--)                              
  {                                                               
     if ( OrderSelect (index, SELECT_BY_TICKET)                   // existing orders
//&&  OrderMagicNumber()  == MagicNumber                      // with my MN    
&&  OrderSymbol()       == Symbol ())                           // with my symbol
  {                                                                                                                                                    
     if (OrderType() == OP_SELL) order = OrderTicket(); 
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<                       
     if (OrderClosePrice() >= OrderOpenPrice() + (ATR* 2 )) // condition to be met,
                                                         // control then passes to...
  {                                                     
      OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(), Blue ); // OrderClose
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
       Print ( "Sell order closed with Hard Stop" ); 
     }     
   else
  {
       Print ( "Error closing Sell Hard Stop" , GetLastError ()); 
   }   
//---------- Closeing Buy -------------
           
     if (OrderType() == OP_BUY)  order = OrderTicket(); 
    
     if (OrderClosePrice() <= OrderOpenPrice() - (ATR* 2 ))         // ATR*2 below Buy. Hard Stop
  {
      OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(), Red ); 
       Print ( "Buy order closed with Hard Stop" );
     }     
   else 
  {
       Print ( "Error closing Buy Hard Stop" , GetLastError ());                                      
       return ( 0 ); 
    }                                              
  } 
}


//------------ Opening Buy -----------------

if ( OrdersTotal () < 1 )                                         // Checking for any working orders
   {                                   
     if (Ask > High[iHighest( NULL , 0 ,MODE_HIGH, 20 , 1 )])         // When this condition is true, 
                                                               // with no working orders  
   {                                                                                     
        ticket= OrderSend ( Symbol (),OP_BUY,Lots,Ask,Slippage, 0 , 0 , " " , 0 , 0 , Blue );
                                                               // Buy! Useing these parameters  
     if (ticket> 0 )
   { 
       if ( OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES))                                                       
       Print ( "Buy Order Was a Big Success :" , OrderOpenPrice());
    }
   else
       Print ( "Error Opening Buy Order :" , GetLastError ()); 
       return ( 0 );                                                  
  }  
                                                      
//--------------- Opening Sell ----------------
                                                                         
   if (Bid < Low[iLowest( NULL , 0 ,MODE_LOW, 20 , 1 )])                 //When this condition is true, 
                                                               //with no working orders
    {   
      ticket= OrderSend ( Symbol (),OP_SELL,Lots,Bid,Slippage, 0 , 0 , " " , 0 , 0 , Red );  
                                                               //Sell! Useing these parameters
   if (ticket> 0 )
     {     
       if ( OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES))                                                
       Print ( "Sell Order Was a Big Success :" , OrderOpenPrice());
     }
     else
       Print ( "Error Opening Sell Order :" , GetLastError ());
       return ( 0 );
     }  
     return ( 0 ); 
  }
}
 

Merhaba Huckleberry,
Programınızı biraz yeniden şekillendireceğim.
Şimdilik hoşça kal

 

Neden "order = OrderTicket();" kullanılır ve bu değer orderclose() işlevinde kullanılmaz?
Seçilen siparişin değişme olasılığı düşük olsa da, pozitif olarak tanımlanmış sipariş değerini kullanmak daha güvenli olmaz mıydı?
-
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(), Blue );
OrderTicket() şu anda seçili bilet olacak - öğrenmemin bu aşamasında
OrderClose() işlemini yaptığınızda hangi orderticket'in seçildiğini söyleyemem.

//// Düzenlemek
Aslında "order= OrderTicket()" öğesinin önceki If ifadesinde tanımladığınız bilet olduğundan emin değilim.

 
Ais wrote >>

Merhaba Huckleberry,
Programınızı biraz yeniden şekillendireceğim.
Şimdilik hoşça kal


Çok teşekkür ederim. Cevabınızı bekliyor olacağım.
Şerefe
 
Ickyrus wrote >>

Neden "order = OrderTicket();" kullanılır ve bu değer orderclose() işlevinde kullanılmaz?
Seçilen siparişin değişme olasılığı düşük olsa da, pozitif olarak tanımlanmış sipariş değerini kullanmak daha güvenli olmaz mıydı?
-
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(), Blue );
OrderTicket() şu anda seçili bilet olacak - öğrenmemin bu aşamasında
OrderClose() işlemini yaptığınızda hangi orderticket'in seçildiğini söyleyemem.

//// Düzenlemek
Aslında "order= OrderTicket()" öğesinin önceki If ifadesinde tanımladığınız bilet olduğundan emin değilim.


Merhaba Ickyrus
Gözleminiz ve öneriniz için teşekkürler. Zamanınız değerlidir.
Mantığınız çok mantıklı. Seçilen sıralamaya gelince artık sizin kadar emin değilim. Önerinizi bir deneyeceğim.
Tekrar teşekkürler
Şerefe