[UYARI, KONU KAPALI!] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde. - sayfa 13

 
keekkenen >> :

Gerçek şu ki, bir siparişi kapatan OrderClose() işlevi, ilk parametre olarak sipariş numarasını alır ve sipariş numarası yalnızca OrderSelect() aracılığıyla mevcut siparişlere erişilerek elde edilebilir, bu nedenle genel durumda kapanış bir şey gibi görünür. bunun gibi..


OrdersTotal() = 0 ise, yani açık emir yoksa for döngüsü hemen biter..



Cevabınız için teşekkürler, ancak OrderSend fonksiyonunun başlangıcını yazabilir misiniz? son parantezlerden hemen sonra mı gelmeli????

 
vadim2304 >> :

Cevabınız için teşekkürler, ancak OrderSend fonksiyonunun başlangıcını yazabilir misiniz? son parantezlerden hemen sonra mı gelmeli????

işte bir örnek

 #define              OP_BALANCE     6
int                   TRY             = 1 ;      
int                   TRADESLEEP     = 1000 ;   
int                   SLIPPAGE       = 3 ;

int start ( ) {
   // ничего не делать   
   int action = OP_BALANCE ;

   if ( isTime ( Period ( ) * 60 ) ) {
       // закрываем ордера по текущему инструменту
      closeAllOrdersBySymbol ( SLIPPAGE , TRY , TRADESLEEP ) ;
   
   // получаем условие покупать, продавать, ничего не делать   
   action = getAction ( ) ;
   
   if ( action = = OP_BALANCE ) return ( 0 ) ;
   
   // для примера минимальный лот   
   double lots = MarketInfo ( Symbol ( ) , MODE_MINLOT ) ;
   
   //количество пунктов для стоплоса и текпрофита - сами определите
   int slPoint = 0 , tpPoint = 0 ;
      
   string сomment = "" ; // значение для комментария по умолчанию
   int magicNumer = 0 ; // значение по умолчанию
   
   // открываем позицию - while используется для того чтобы открывать позицию пока она не откроется
   while ( ! openOrder ( action , lots , slPoint , tpPoint , SLIPPAGE , сomment , magicNumer , TRY , TRADESLEEP ) ) { }
   }
   return ( 0 ) ;      
}    
//+------------------------------------------------------------------+
//|  открывает  позицию по рынку                                     |
//+------------------------------------------------------------------+
int getAction ( ) {
   int act = OP_BALANCE ;
   
   /* здесь нужно написать логику, 
      если что-то, то покупать act = OP_BUY;
      если что-то, то продавать act = OP_SELL;   
   */
   return ( act ) ;
}
//+------------------------------------------------------------------+
//|  открывает  позицию по рынку                                     |
//+------------------------------------------------------------------+
bool openOrder ( int type , double lots , int slPoint , int tpPoint , int slippage , string comment , 
               int magicNumer , int try , int tradeSleep ) {     
   bool res = false ;
   int err = 0 ;    
   double price , tp = 0 , sl = 0 , ask = 0 , bid = 0 ;   
   color col = CLR_NONE ;
   Comment ( "Открытие ордера..." ) ;       
   
   while ( try ! = 0 ) {
       while ( IsTradeContextBusy ( ) | | ! IsTradeAllowed ( ) ) { Comment ( "Торговый поток занят..." ) ; Sleep ( tradeSleep ) ; }         
       RefreshRates ( ) ; 
      ask = MarketInfo ( Symbol ( ) , MODE_ASK ) ;
      bid = MarketInfo ( Symbol ( ) , MODE_BID ) ;    
       if ( type = = OP_BUY )    {
         price = ask ; col = Red ;
         if ( slPoint > 0 ) sl = bid - slPoint * Point ; 
         if ( tpPoint > 0 ) tp = ask +   tpPoint * Point ;
       }
      
       if ( type = = OP_SELL ) {
         price = bid ; col = Blue ;
         if ( slPoint > 0 ) sl = ask + slPoint * Point ; 
         if ( tpPoint > 0 ) tp = bid - tpPoint * Point ;    
       }            
            
       if ( type = = OP_BUY & & AccountFreeMarginCheck ( Symbol ( ) , OP_BUY , lots ) < = 0 | | GetLastError ( ) = = 134 ) 
         { Comment ( "Недостаточно свободных средств !" ) ; Sleep ( 2000 ) ; return ( res ) ; }
       if ( type = = OP_SELL & & AccountFreeMarginCheck ( Symbol ( ) , OP_SELL , lots ) < = 0 | | GetLastError ( ) = = 134 )
         { Comment ( "Недостаточно свободных средств !" ) ; Sleep ( 2000 ) ; return ( res ) ; }             
      
      res = OrderSend ( Symbol ( ) , type , lots , price , slippage , sl , tp , comment , magicNumer , 0 , col ) ;
       if ( res ! = - 1 ) {     
         PlaySound ( "alert.wav" ) ;     
         try = 0 ;                           
         Comment ( "Ордер открыт !" ) ;           
       } else {
         err = GetLastError ( ) ;
         if ( err > 1 ) try = 0 ;
         Comment ( "Ошибка - " , err ) ;           
       }   
       Sleep ( 2000 ) ;        
   }   
   return ( res ) ;
}
//+------------------------------------------------------------------+
//|  закрытие одеров
//+------------------------------------------------------------------+  
bool closeAllOrdersBySymbol ( int slippage , int try , int tradeSleep ) {
   int k = OrdersTotal ( ) , err , nextTry ;
   string msg = "" ;
   bool res = false ;   
   
   for ( int i = 0 ; i < k ; i + + ) {
       if ( OrderSelect ( i , SELECT_BY_POS , MODE_TRADES ) & &
         OrderSymbol ( ) = = Symbol ( ) ) { 
         nextTry = try ;             
         while ( nextTry ! = 0 ) {
             while ( IsTradeContextBusy ( ) | | ! IsTradeAllowed ( ) )
               { Comment ( "Торговый поток занят ..." ) ; Sleep ( tradeSleep ) ; }                
            res = OrderClose ( OrderTicket ( ) , OrderLots ( ) , OrderClosePrice ( ) , slippage , CLR_NONE ) ;
             if ( res ) {                       
               nextTry = 0 ;
               res = true ;     
               Comment ( "Ордер закрыт !" ) ;               
             } else {                                                           
               if ( err > 1 ) nextTry = 0 ;   
               Comment ( "Ошибка - " , err ) ;         
             }                             
         }                          
       }
   }   
   return ( res ) ;
}
//+------------------------------------------------------------------+  
bool isTime ( int sec ) {
   bool res = false ;
   static datetime time = 0 ;
   double min = 0 ;
   if ( TimeCurrent ( ) > = time ) {
      min = MathFloor ( sec / 60 ) ;
       if ( min = = 0 ) min = 1.0 ;          
      time = iTime ( NULL , PERIOD_H1 , 0 ) + ( MathFloor ( Minute ( ) / min ) + 1 ) * min * 60 ;
      res = true ;
   } 
   return ( res ) ;
}
 
Programcılar için basit bir soru:

Söylesene, hangi fonksiyon "Ticaret" sekmesinde gösterilen açık emirler için marj seviyesinin değerini (yüzde olarak) döndürür?

Yardımda listelenen işlevlerin hiçbiri bu değeri döndürmez.

HesapMarjı

HesapSerbestMarj
HesapSerbestMarjKontrol
HesapSerbestMarjModu
 
khorosh >> :

Damiani_Volt göstergesini kullanabilirsiniz.

İlginç şeyler, teşekkürler

 
keekkenen >> :
işte burada

Sayesinde

 
satop >> :

Kızgın olduğumu nereden çıkardın?

sadece bunu açıklıyorum

herhangi bir eşitsizlik işareti almak ve sürmek

test cihazında, pozitif bir sonuç elde edebilirsiniz

sonuç, belirli bir düzeyde ve hangi düzeyde olursa olsun

pozitif veya negatif. Ve soruya

Eksi ile veya eksi olmadan seviye nasıl alınır,

Ne yazık ki, net bir ayrım yok.


Belki de ben hatalıyım..........

Soru, yeni başlayanın neyi BİLMEDİĞİNİ sormasıdır. Bu kod örneği, bir Uzman Danışmanın yapısını (doğru yapıyı) anlamak için kullanılır.

Ve bu kod parçasına yatırılan şey, KLASİK ticaret ilkesine göre inşa edilmiştir. Hem danışmanın kendisi hem de kod örnekleri, birisini kandırmak veya bir şeyi yakalamak amacıyla değil, ilkeleri incelemeye hizmet ediyor ....... Sorduğum şey net olmadığı anlamına geliyor. Sonuçta, tamamen teorik olarak ne ve nasıl olduğunu anlamak GEREKİR. Ve sonra yaratın, şekillendirin, icat edin ........

 
Lütfen bana grafikte jpeg göstermenin mümkün olup olmadığını söyler misiniz?
 
keekkenen 25.02.2009 11:34 1) Lütfen açıklayın, OrderSend (...) fonksiyonu int tipine sahip ve siz onu bool tipi olarak tanımlıyorsunuz ve bool tipinde -1 değeri yok, bu ne kadar doğru? ? 2) KimIV için pozisyon açma fonksiyonunda tekrarlama for(..) döngüsü ile, sizin için ise while(...) üzerinden yapılır. sizce hangi yol daha iyi?
 

1. bu bir hatadır.. bir sipariş açmanın başarı/başarısızlık değerini döndürmek için res olarak int bildirmeniz ve başka bir bool türü değişken eklemeniz gerekir..

2. Daha önce Igor'un OpenPosition() işlevinin uygulamalarından birini de kullandım, ancak daha sonra hataları yakalamayı ve bunlarla ilgili mesajları görüntülemeyi kolaylaştırmak için işlevi değiştirdim..

sonuç bir yapıydı

 while ( try ! = 0 ) {
       // определение условий для открытыия позиции
       //..
     
       // открытие позициц
      res = OrderSend ( . . . ) ;
      
       if ( res > 0 ) { 
         PlaySound ( "alert.wav" ) ;     
         try = 0 ;                           
         Comment ( "Ордер открыт !" ) ; 
         Sleep ( 2000 ) ;        
         ret = true ;
       } else {
         /* блок определения ошибок и возврат 
          err - уровень критичности ошибки (0,1,2,3) 
          msg - описание ошибки (если showErrors = true)
          уровни определяются по номеру ошибки
          0-нет ошибки, 1-надо ждать и обновлять,
          2-сделка бракуется,3-фатальная ошибка*/
          
         ErrorBlock ( showErrors , err , msg ) ;
         if ( err > 1 ) try = 0 ; // в данном случае 2 и 3 критичны
         Comment ( "Ошибка - " , msg ) ; 
         Sleep ( 2000 ) ;          
       }              
   }   
 
İşlevinizde, doğru anlarsam , sürekli alıntılar varsa, o zaman Igor'un işlevinin aksine deneme sayısı sınırsız mı? Bu durumda herhangi bir kısıtlamaya gerek var mı?