[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 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);
}
 
Простой вопрос программистам:

Подскажите, какая функция возвращает значение уровня маржи (в процентах) для открытых ордеров, который показан во вкладке "Торговля" ?

В справке из перечисленных функций ни одна не возвращает это значение.

AccountMargin 

AccountFreeMargin 
AccountFreeMarginCheck 
AccountFreeMarginMode
 
khorosh >>:

Можно использовать индикатор Damiani_Volt.

Интересная вещица, благодарю

 
keekkenen >>:
вот оно

Благодарю

 
satop >>:

Я с чего Вы взяли что я злюсь.

Просто я так объясняю о том что

взяв любой знак неравенства и прогнав

в тестере можно добиться положительного

результата, с неким уровнем, и неважно какой уровень

положительный или отрицательный. И на вопрос

как правильно, с минусом или без, брать уровень,

чётких разграничений к сожалению нет.ИМХО


Может я и ошибся..........

Вопрос в том, что новичок спрашивает то что он НЕЗНАЕТ. Данный пример кодов служит для понимания строения (правильного строения) советника.

И то что вложено в этот кусок кода, построено по КЛАССИЧЕСКОМУ принципу торговли. И сам советник, и образцы кода служат для изучения принципов, а не с целью кого то подколоть или подловить на чём либо.......То что спрашиваю, значит непонятно. Ведь пока чисто теоретически НУЖНО понять что и как. А уж затем творить, ваять, выдумывать........

 
Подскажите пожалуйста, можно ли на график вывести jpeg?
 
keekkenen 25.02.2009 11:34 1) Объясните пожалуйста, функция OrderSend(...) имеет тип int, а Вы определяете её типом bool, а ведь в типе bool нет значения -1, насколько это корректно? 2) У KimIV в функции открытия позиции повтор сделан через цикл for(..), а у Вас через while(...). как Вы считаете какой способ лучше?
 

1. это ошибка.. нужно res объявить как int и добавить другую переменную типа bool для возврата значения успеха/не успеха открытия ордера..

2. раньше я тоже использовал одну из реализаций функции Игоря 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);         
      }             
   }  
 
В Вашей функции, если я правильно понимаю, если идут беспрерывные реквоты, то количество попыток в отличии от функции Игоря неограничено? Нужно ли в этом случае какое-то ограничение?
Причина обращения: