[警告は閉鎖されました!】フォーラムを乱雑にしないために、どんな初心者の質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしでは、どこにも行けない。 - ページ 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);
}
 
プログラマーへの素朴な質問:

「取引」タブに表示される、未決済注文のマージンレベルの値(%)を返す関数を教えてください。

Helpでは、列挙したどの関数もこの値を返しません。

AccountMargin

AccountFreeMargin
AccountFreeMarginCheck
AccountFreeMarginMode
 
khorosh >> :

Damiani_Voltインジケータを使用することができます。

興味深い内容です、ありがとうございました。

 
keekkenen >> :
それ来た

ありがとうございました。

 
satop >> :

なぜ私が怒っていると思うのですか?

ということを説明するのが私のやり方です。

不等号をとって実行することで

>> テスターでは、ポジティブを得ることができます。

を、どのレベルであっても構いません。

ポジティブまたはネガティブとの質問には

を取るか、マイナスを取らないか。

残念ながら、明確な区別はありません。


間違えてしまったかもしれない......。

問題は、初心者が「知らない」ことを聞いていることです。このサンプルコードは、EAの構造(正しい構造)を理解するためのものです。

そして、このコードに組み込まれているのは、クラシカルな取引の原則に基づいて構築されているものです。Expert Advisor自体もコードサンプルも、原理を勉強するためのもので、誰かをつついたり、何かで釣ったりするためのものではないのですが......。 私が聞いていることは、それが明確ではないということです。結局のところ、何をどのように理論的に理解しなければならないのです。そして、創造、彫刻、発明......。

 
グラフ上にjpegを出力することが可能かどうか教えてください。
 
keekkenen 2009.02.25 11:34 1)OrderSend(...) 関数は int 型ですが、あなたは bool 型として定義していますが、bool 型には -1 の値はありません。 2) KimIV 関数のポジションオープニングの繰り返しは for(...) で行われていますが、あなたのは while(...) で行われていますが、どちらの方法が良いと思いますか?
 

1.これはエラーです...resはintで宣言され、もう一つbool型の変数を追加して、注文を開くことに成功したか失敗したかの値を返す ようにしなければなりません...。

2.IgorのOpenPosition()関数の実装の1つを以前使用していましたが、その後、エラーをキャッチして報告しやすくするために関数を変更しました...。

その結果、次のような構造になります。

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);         
      }             
   }  
 
もし私があなたの関数で正しく理解しているならば、連続したrequoteが ある場合、Igorの関数とは異なり、試行回数は無制限なのでしょうか?この場合、何らかの制限が必要でしょうか?