[경고, 주제 닫힘!] 포럼을 어지럽히지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 당신 없이는 어디에도 없습니다. - 페이지 13

 
keekkenen >> :

사실은 주문을 마감하는 OrderClose() 함수는 주문 번호를 첫 번째 매개 변수로 사용하고 주문 번호는 OrderSelect()를 통해 기존 주문에 액세스해야만 얻을 수 있으므로 일반적인 경우 닫기가 뭔가 보입니다. 이와 같이..


OrdersTotal() = 0인 경우, 즉 열린 주문이 없으면 for 루프가 즉시 종료됩니다.



답변 감사합니다만 OrderSend 함수의 시작 부분을 작성할 수 있습니까? 마지막 괄호 바로 뒤에 와야 하나요????

 
vadim2304 >> :

답변 감사합니다만 OrderSend 함수의 시작 부분을 작성할 수 있습니까? 마지막 괄호 바로 뒤에 와야 하나요????

여기 예가 있습니다

 #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 ) ;
}
 
프로그래머를 위한 간단한 질문:

말해봐, "거래" 탭에 표시된 미결 주문에 대한 마진 수준(퍼센트) 값을 반환하는 함수는 무엇입니까?

도움말에 나열된 함수 중 어느 것도 이 값을 반환하지 않습니다.

계정마진

AccountFreeMargin
AccountFreeMarginCheck
계정무료마진모드
 
khorosh >> :

Damiani_Volt 표시기를 사용할 수 있습니다.

흥미로운 내용, 감사합니다.

 
keekkenen >> :
여기있어

덕분에

 
satop >> :

내가 화났다는 생각은 어디서 났어?

나는 단지 그것을 설명하고있다

모든 불평등 기호를 취하고 운전

테스터에서 긍정적인 결과를 얻을 수 있습니다.

결과, 특정 수준, 어떤 수준에 관계없이

긍정적이든 부정적이든. 그리고 질문에

마이너스가 있든 없든 레벨을 잡는 방법,

불행히도 명확한 구분이 없습니다.


내가 틀릴수도...........

질문은 초보자가 자신이 모르는 것을 묻는 것입니다. 이 코드 예제는 Expert Advisor의 구조(올바른 구조)를 이해하는 데 사용됩니다.

그리고 이 코드 조각에 투자된 것은 거래의 CLASSICAL 원칙에 따라 구축됩니다. 어드바이저 자체와 코드 샘플 모두 원칙을 연구하는 데 사용되며 누군가를 속이거나 무언가를 잡기 위한 것이 아닙니다........제가 묻는 것은 명확하지 않다는 뜻입니다. 결국, 순전히 이론적으로 무엇을, 어떻게 이해해야 하는 동안. 그런 다음 만들고, 조각하고, 발명하십시오........

 
그래프에 jpeg를 표시할 수 있는지 알려주실 수 있나요?
 
keekkenen 02/25/2009 11:34 1) OrderSend (...) 함수에 int 유형이 있고 bool 유형으로 정의하고 bool 유형에 -1 값이 없는지 설명하십시오. 얼마나 정확한지 이것? 2) KimIV의 경우 위치 열림 함수에서 for(..) 루프를 통해 반복이 수행되고, 귀하의 경우 while(...)을 통해 반복됩니다. 어떤 방법이 더 낫다고 생각합니까?
 

1. 이것은 실수입니다. res를 int로 선언하고 다른 bool 유형 변수를 추가하여 주문 열기 성공/실패 값을 반환해야 합니다 .

2. 이전에도 Igor의 OpenPosition() 함수 구현 중 하나를 사용했지만 나중에 오류를 포착하고 이에 대한 메시지를 표시하기 쉽도록 함수를 변경했습니다.

최종 결과는 구조였습니다

 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 ) ;          
       }              
   }   
 
귀하의 기능에서 내가 올바르게 이해한다면 연속 requotes 가 있으면 Igor의 기능과 달리 시도 횟수가 무제한입니까? 이 경우 제한이 필요한가요?