Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1076

 
danil77783:

Здравствуйте. Могли бы вы мне помочь, если есть время Вопрос такой, мне нужно, что бы советник открывал ордер по каждому сигналу двух индикаторов, (они дают сигнал при их определённом сочетании) одним словом, в рынке должно быть несколько ордеров на покупку или на продажу, соответственно, согласно сигналам индикаторов. А в рынке у меня только один ордер и пока он не закроется следующий не открывается…… Дело в подсчёте ордеров? Подскажите пожалуйста. Если потребуется могу выслать код.

                Заранее благодарю!

уберите условия "if (OrdersTotal()==0)...." - они как раз-то и говорят: ищем входы и открываем новые ордера только когда ордеров нет вообще.

а чтобы без такого условия не открывалась сразу большая пачка новых - надо придумывать доп.условие. А это уже от вашей стратегии: не открывать новый в течении времени T от предыдущего или контроллировать бары или соблюдать дистанции в пунктах меж ордерами..

 

Здравствуйте. Начну с большого спасибо за то, что помогаете новичкам. Я бы не смог день за днем отвечать на элементарные для себя вопросы то одному новичку, то другому.

А вопрос такой:

Раньше, когда mql4 был чуть другим, считалось, что любую обработку ордера, типа отрыть/закрыть/модифицировать после обработки возможной ошибки необходимо прерывать проход функцией return(0); Из-за этого на тестере (при методе с каждым тиком, фрейм -- минута), если нужно было одновременно закрыть по текущей цене несколько открытых ордеров, то закрывались они тестером по очереди на каждом новом баре, что несколько искажало реальную картину (порой, довольно сильно). В новом советнике нужно закрывать несколько ордеров именно по сигналу да еще и частично.

вопрос: возможно ли в цикле обработать их все (частично закрыть) не прерывая каждый раз проход? Прожует ли это тестер? Т.е. сможет ли он на одном баре частично закрыть их все?

 
XpeHHukoB:

Здравствуйте. Начну с большого спасибо за то, что помогаете новичкам. Я бы не смог день за днем отвечать на элементарные для себя вопросы то одному новичку, то другому.

А вопрос такой:

Раньше, когда mql4 был чуть другим, считалось, что любую обработку ордера, типа отрыть/закрыть/модифицировать после обработки возможной ошибки необходимо прерывать проход функцией return(0); Из-за этого на тестере (при методе с каждым тиком, фрейм -- минута), если нужно было одновременно закрыть по текущей цене несколько открытых ордеров, то закрывались они тестером по очереди на каждом новом баре, что несколько искажало реальную картину (порой, довольно сильно). В новом советнике нужно закрывать несколько ордеров именно по сигналу да еще и частично.

вопрос: возможно ли в цикле обработать их все (частично закрыть) не прерывая каждый раз проход? Прожует ли это тестер? Т.е. сможет ли он на одном баре частично закрыть их все?

Сможет без проблем при одном маленьком условии. Код должен быть написан правильно.

 
Seric29:
Если есть 2 функции(возможно перегруженные) к примеру int Funkz(int a) int Funkz(int a, int b, int w), и дальше программа откомпилирована, какая функция сработает быстрее, первая учитывая то что у неё один аргумент или это не имеет значения т.к. программа уже собрана и происходит то что описано в теле, или всё таки маленькое влияние есть ведь аргументы функции представляют собой стэк на который резервируется память?

если у вас в коде есть две одноименные функции с разным количеством аргументов, то вопрос не стоит в том, какая будет вызвана быстрее. ведь вызывая функцию вы не пишете Funkz(), Вы указываете количество аргументов. укажете 1 вызовется одна, укажете 3 -- другая.

вопрос в том, прожует ли компилятор такие одноименные функции.

речь, как я понимаю, не о коде, а о откомпилированном файле? 

 
хм... Спасибо за ответ, Алексей. многое прояснилось.
 
Помогите пожалуйста, у нас есть SL равный какому то значению в пунктах (это уровень убытка - изменяемый параметр пользователем), а также у нас есть цена по символу по дневке лоу или хай - это как второй стоп лосс и в разные временные точки они будут разными, нужна функция авто сравнения - что бы после этого робот выставлял стоп лосс по наименьшему параметру (SL или Ilow - для бай или SL -iHign для селл) ниже привел код который не дает нужного результата,  не могу понять в чем дело...
   пользовательский параметр - extern int    SL               = 1000;
//---------------------------------------------------------------
bool CheckForStopLossSell()
  {
   double Hign=iHigh(Symbol(),PERIOD_D1,1);
   double StopLoss=NormalizeDouble(SL*Point,Digits);
   double uroven = StopLoss;
   double OOPS=iLow(Symbol(),PERIOD_D1,1)-StepOpenOrder*Point;
   double StopLossS=NormalizeDouble(OOPS+StopLoss,Digits);
   //----------------------------------------
   if(Hign>StopLoss) Alert("StopLoss");
   return bool(StopLossS);
   
   //else
   if(Hign<StopLoss) Alert("Hign");
   return bool(Hign); 
   
   //else
   Alert("uroven");
   return bool(uroven); 
   
  }
//--------------------------------------------------------------
bool CheckForStopLossBuy()
  {
   double LOW=iLow(Symbol(),PERIOD_D1,1);
   double StopLoss=SL*Point;
   double uroven = StopLoss;
   double SPREAD = MarketInfo(Symbol(),MODE_SPREAD)*Point;
   double OOPB = (iHigh(Symbol(),PERIOD_D1,1)+SPREAD)+StepOpenOrder*Point;
   double StopLossB=OOPB-StopLoss;
   //-------------------------------------------
   if(LOW<StopLoss) Alert("StopLoss"); 
   return bool(StopLossB);  
   
   //else
   if(LOW>StopLoss) Alert("LOW"); 
   return bool(LOW);  
   
   //else
   Alert("uroven");
   return bool(uroven);  
   
  }
//---------------------------------------------------------------
 
XpeHHukoB:

если у вас в коде есть две одноименные функции с разным количеством аргументов, то вопрос не стоит в том, какая будет вызвана быстрее. ведь вызывая функцию вы не пишете Funkz(), Вы указываете количество аргументов. укажете 1 вызовется одна, укажете 3 -- другая.

вопрос в том, прожует ли компилятор такие одноименные функции.

речь, как я понимаю, не о коде, а о откомпилированном файле? 

А если функции разные то что тогда, какая быстрее сработает с малым или большим количеством аргументов? Мне кажется перегрузка с разным количеством тоже несёт нагрузку или это для удобства сделано?

 

Подскажите пожалуйста как правильно написать #define ?

Пишу так

#define my_POS    cst_Position.my_Position

Если поменять эту конструкцию на деф - всё работает.

my_POS.SelectByTicket(pos_DATA(DATA_TICKET))

Но когда я просто пишу my_POS. , то после точки не выпадает список функций. 

То же и для

#define pos_DATA  cst_Position.getPositionData

после pos_DATA( нет никаких подсказок.

Что я делаю не так?

 
bool operation=0;for(int pos=0;pos<OrdersTotal();pos++)
     {if ( OrderSelect (pos, SELECT_BY_POS) == false )  continue;
      if ( OrderSymbol()==Symbol()) break;}


//=========================================================================================================
if(Hour()>=2&&Hour()<=18&&operation==0){
if(OPB1==1)
   {operation=1;if(operation==0 &&OrderSymbol()!=Symbol()||OrdersTotal()==0)
        {OrderSend(Symbol(),OP_BUY,lots,Ask,0,Bid-ss*Point,Ask+T*Point,"My order#",mn,0,Green);}}
        if (OrderType()==OP_BUY &&OrdersTotal()==1&&OrderMagicNumber()==8)
        {OrderSend(Symbol(),OP_SELLSTOP,5*lots,OrderOpenPrice()-(ss-ss/4)*Point,0,0,SstopClose,"My order#",80,0,Red);}
       

if(OPS1==1)
   {operation=1;if(operation==0 &&OrderSymbol()!=Symbol()||OrdersTotal()==0)        
         {OrderSend(Symbol(),OP_SELL,lots,Bid,0,Ask+ss*Point,Bid-T*Point,"My order#",mn,0,Red);}}
         if (OrderType()==OP_SELL &&OrdersTotal()==1&&OrderMagicNumber()==8)
         {OrderSend(Symbol(),OP_BUYSTOP,5*lots,OrderOpenPrice()+(ss-ss/4)*Point,0,0,BstopClose,"My order#",80,0,Green);}}



if(OrderMagicNumber()==80){operation=0;
 {for( int  ii=OrdersTotal()-1;ii>=0;ii--)
       {OrderSelect(ii, SELECT_BY_POS);
        int  type   = OrderType();bool result = false;
        switch(type)
         {case OP_BUYSTOP   : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );//break;
          case OP_SELLSTOP  : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red ); //break;
         
          result = OrderDelete( OrderTicket() );//break;
          }}}}

Здравствуйте, уважаемые эксперты!

Помогите, пожалуйста решить проблему.

При тестировании любой пары все работает правильно, но при работе с остальными валютами, отложенные ордера не выставляются (приходится выставлять вркчную) и не закрываются после срабатывания тейк профита.

Если можно, подскажите как изменить код:



Спасибо большое заранее

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...
Файлы:
c5k8icfo.png  55 kb
 
Motzaart:

Здравствуйте, уважаемые эксперты!

Помогите, пожалуйста решить проблему.

...

Пожалуйста, правильно вставляйте код:


Причина обращения: