Ваши вопросы по языку MQL4

Milord

Местный знаток
Короче нет, но у меня такой вариант.
Лучше тем что мартинит в обе стороны.
PHP:
/////////////////////////////////////////////////////////////////////////////////// 
 void martini_f(string symb="")
 {
 double order_B_price=-1;
double order_S_price=-1;
int type=-1;
string symb_B;
string symb_S;


 for(int i=OrdersTotal()-1; i>=0; i--)
 {
   if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
   
   if(OrderMagicNumber()!=Magic || (symb!="" && OrderSymbol()!=symb)) continue;
    type=OrderType();
   
   if(order_B_price==-1 && type==OP_BUY) {order_B_price=OrderOpenPrice();symb_B=OrderSymbol();}
   if(order_S_price==-1 && type==OP_SELL) {order_S_price=OrderOpenPrice();symb_S=OrderSymbol();}
   
   if(order_B_price!=-1 && order_S_price!=-1) break;
 }
   
   
   
   
   if(order_B_price!=-1)
   {
   double point=MarketInfo(symb_B,MODE_POINT)*point_multip;
   //
   if(MarketInfo(symb_B,MODE_ASK)<=order_B_price-step*point) 
   {
    CountOpenedPositions_f(symb);
    double Lotss=Lot*MathPow(Lot_multip,buys_);
   int ticket_op_m=-1;
   
   for (int j_op_b = 0; j_op_b < MaxAttempts; j_op_b++)
 {
 while(IsTradeContextBusy()) Sleep(int(pause_if_busy*1000));
 RefreshRates();
                             
  ticket_op_m=OrderSend(symb,OP_BUY,NormalizeDouble(Lotss,nor_lot),MarketInfo(symb_B,MODE_ASK),Slippage,0,0,comment,Magic,0,clrNONE);

 if(ticket_op_m>-1)break;
 }
   
   } 
   }    
        
   if(order_S_price!=-1)
   {
   double point=MarketInfo(symb_S,MODE_POINT)*point_multip;
   //
   if(MarketInfo(symb_S,MODE_BID)>=order_S_price+step*point) 
   {
    CountOpenedPositions_f(symb);
    double Lotss=Lot*MathPow(Lot_multip,sells_);
   int ticket_op_m=-1;
   
    for (int j_op_s = 0; j_op_s < MaxAttempts; j_op_s++)
 {
 while(IsTradeContextBusy()) Sleep(int(pause_if_busy*1000));
 RefreshRates();
                             
  ticket_op_m=OrderSend(symb,OP_SELL,NormalizeDouble(Lotss,nor_lot),MarketInfo(symb_S,MODE_BID),Slippage,0,0,comment,Magic,0,clrNONE);

 if(ticket_op_m>-1)break;
 }
   
   }
   }     
  
 
 }

Спасибо Василий за код,еще больше раза в два чем у мобидика:please:
думаю за неделю смогу его прочесть и исправить ошибки или нет, вопщем время покажет,смогу или нет!;)
компилятор не хочет компилировать*hi*
 

Вложения

  • Screenshot - 31_05 003.jpg
    Screenshot - 31_05 003.jpg
    15,4 КБ · Просмотры: 109
Последнее редактирование:

mobidik

-----
согласен - лучше качественно и надежно!
хотел погонять в тестере этот мартин,но компилятор ругается на код, видимо ошибки где то, в моем варианте до того не ругался..,вот что он пишет:

Подозреваю, что Вы объявили эти переменные на глобальном уровне, а потом, в указанных строках, которых не видно на скрине, есть повторное объявление.
 

Milord

Местный знаток
Подозреваю, что Вы объявили эти переменные на глобальном уровне, а потом, в указанных строках, которых не видно на скрине, есть повторное объявление.

вот сам сов,ничего в вашем варианте мартина не менял,кроме того что сменил 2 на переменную dec, в числе знаков Lots,посмотрите свежим взглядом - на что ругается компилятор, правда он у меня старого билда 509,новый еще не освоил,хотя и старый еще учить и учить..;)
п.с. - еще вопрос - как вы делаете текст кода свернутым?

PHP:
extern int       dec=1;
extern int       TP=10;
extern double    Lots=0.6;       
extern int       MaxOrders=10;
//--------------------------------
extern int       Per=20;
//---------------------------------
extern bool      MARTINGAYL=true;
extern int       Mpip=1;
extern int       LotExp=1;
//---------------------------------
extern int       slippage=3;
extern int       Magic=123;

int init()
  {

  return(0);
  }

int deinit(){
   return(0);
  }
//--------------------------------------------------------------------------------+
int start()
{
if(MARTINGAYL)Martin();
//-----------------------
RefreshRates();
double ma=iMA(Symbol(),0,Per,0,3,0,0);
//-----------------------------
if(OrdersTotal()<MaxOrders)
 {
//-----------------------------1---------------------------------------------------+
  if(Ask < ma)
   {
   OrderSend(Symbol(),OP_BUY,Lots,Ask,slippage,0,Ask+TP*Point,"",Magic,0,Aqua);
   }
//---------------------------
  if(Bid > ma)
   {
   OrderSend(Symbol(),OP_SELL,Lots,Bid,slippage,0,Bid-TP*Point,"",Magic,0,Magenta);
   }
//----------------------------------------------------------------------------------+
}
return(0);
}

//------------------------------------MARTINGAYL-------------------------------------------------------+
void Martin() 
  { 
    int    LastTicket = 0; 
    int    LastType   =-1; 
    double LastOpenPr = 0; 
    double LastLot    = 0; 
//---------------------------------------
    for(int i=OrdersTotal()-1;i>=0; i--)  
     {  
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))                 // Проверяем только рыночные ордера 
        {                                                             // 
          if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)    // Только по данному символу с заданным меджиком 
           {                                                          // 
             if(OrderType()==OP_BUY || OrderType()==OP_SELL)          // Проверку производим только по ордерам BUY/SELL 
              {                                                       // 
                if(LastTicket<OrderTicket())                          // Если тикет найденного ордера больше за предыдущий 
                 {                                                    // значит он последний среди уже проверенных 
                   LastTicket = OrderTicket();                        // запомним его значение 
                   LastType   = OrderType();                          // запомним его тип  
                   LastOpenPr = OrderOpenPrice();                     // запомним его цену открытия 
                   LastLot    = OrderLots();                          // и запомним его лот 
                 } 
              }  
           } 
        } 
     }   
//---------------------------   
    if(LastTicket==0) return;                                         // Перебрали все ордера, если LastTicket=0 - ордеров 
                                                                      // в рынке нет - выход из функции  
    if(LastType!=-1 && LastOpenPr!=0 && LastLot!=0)                   // иначе проверим наличие полученных данных 
     {                                                                // 
       if(LastType==OP_BUY)                                           // если последний ордер BUY  
        {                                                             // 
          if(Ask<=LastOpenPr-Mpip*Point)                              // проверим на условие дистанции 
           {                                                          // если условие выполняется - установим новый ордер 
             double OOL = NormalizeDouble(LastLot*LotExp,dec);        // зададим лот 
             double OOP = NormalizeDouble(Ask,Digits);                // зададим цену открытия 
             double OTP = NormalizeDouble(Ask+TP*Point,Digits);       // зададим значение ТР 
              
             if(!OrderSend(Symbol(),OP_BUY,OOL,OOP,slippage,0,OTP,"",Magic,0,Aqua))// Установка ордера не для ECN счета!!! 
              Print("Ошибка установки ордера BUY, код ошибки - ",GetLastError());  // если ордер не установился, узнаем по какой ошибке 
           } 
        } 
//--------------------------     
       if(LastType==OP_SELL)                                          // если последний ордер SELL  
        {                                                             // 
          if(Bid>=LastOpenPr+Mpip*Point)                              // проверим на условие дистанции 
           {                                                          // если условие выполняется - установим новый ордер 
             double OOL = NormalizeDouble(LastLot*LotExp,dec);        // зададим лот 
             double OOP = NormalizeDouble(Bid,Digits);                // зададим цену открытия 
             double OTP = NormalizeDouble(Bid-TP*Point,Digits);       // зададим значение ТР 
              
             if(!OrderSend(Symbol(),OP_SELL,OOL,OOP,slippage,0,OTP,"",Magic,0,Aqua))// Установка ордера не для ECN счета!!! 
              Print("Ошибка установки ордера SELL, код ошибки - ",GetLastError());  // если ордер не установился, узнаем по какой ошибке
           } 
        } 
     } 
  }    
//--------------------------------------end---------------------------------------
 
Последнее редактирование:

mobidik

-----
вот сам сов,ничего в вашем варианте мартина не менял,кроме того что сменил 2 на переменную dec, в числе знаков Lots,посмотрите свежим взглядом - на что ругается компилятор, правда он у меня старого билда 509,новый еще не освоил,хотя и старый еще учить и учить..;)
п.с. - еще вопрос - как вы делаете текст кода свернутым?
PHP:
extern int       dec=1;
extern int       TP=10;
extern double    Lots=0.6;       
extern int       MaxOrders=10;
//--------------------------------
extern int       Per=20;
//---------------------------------
extern bool      MARTINGAYL=true;
extern int       Mpip=1;
extern int       LotExp=1;
//---------------------------------
extern int       slippage=3;
extern int       Magic=123;

int init()
  {

  return(0);
  }

int deinit(){
   return(0);
  }
//--------------------------------------------------------------------------------+
int start()
{
if(MARTINGAYL)Martin();
//-----------------------
RefreshRates();
double ma=iMA(Symbol(),0,Per,0,3,0,0);
//-----------------------------
if(OrdersTotal()<MaxOrders)
 {
//-----------------------------1---------------------------------------------------+
  if(Ask < ma)
   {
   OrderSend(Symbol(),OP_BUY,Lots,Ask,slippage,0,Ask+TP*Point,"",Magic,0,Aqua);
   }
//---------------------------
  if(Bid > ma)
   {
   OrderSend(Symbol(),OP_SELL,Lots,Bid,slippage,0,Bid-TP*Point,"",Magic,0,Magenta);
   }
//----------------------------------------------------------------------------------+
}
return(0);
}

//------------------------------------MARTINGAYL-------------------------------------------------------+
void Martin() 
  { 
    int    LastTicket = 0; 
    int    LastType   =-1; 
    double LastOpenPr = 0; 
    double LastLot    = 0; 
//---------------------------------------
    for(int i=OrdersTotal()-1;i>=0; i--)  
     {  
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))                 // Проверяем только рыночные ордера 
        {                                                             // 
          if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)    // Только по данному символу с заданным меджиком 
           {                                                          // 
             if(OrderType()==OP_BUY || OrderType()==OP_SELL)          // Проверку производим только по ордерам BUY/SELL 
              {                                                       // 
                if(LastTicket<OrderTicket())                          // Если тикет найденного ордера больше за предыдущий 
                 {                                                    // значит он последний среди уже проверенных 
                   LastTicket = OrderTicket();                        // запомним его значение 
                   LastType   = OrderType();                          // запомним его тип  
                   LastOpenPr = OrderOpenPrice();                     // запомним его цену открытия 
                   LastLot    = OrderLots();                          // и запомним его лот 
                 } 
              }  
           } 
        } 
     }   
//---------------------------   
    if(LastTicket==0) return;                                         // Перебрали все ордера, если LastTicket=0 - ордеров 
                                                                      // в рынке нет - выход из функции  
    if(LastType!=-1 && LastOpenPr!=0 && LastLot!=0)                   // иначе проверим наличие полученных данных 
     {                                                                // 
       if(LastType==OP_BUY)                                           // если последний ордер BUY  
        {                                                             // 
          if(Ask<=LastOpenPr-Mpip*Point)                              // проверим на условие дистанции 
           {                                                          // если условие выполняется - установим новый ордер 
             double OOL = NormalizeDouble(LastLot*LotExp,dec);        // зададим лот 
             double OOP = NormalizeDouble(Ask,Digits);                // зададим цену открытия 
             double OTP = NormalizeDouble(Ask+TP*Point,Digits);       // зададим значение ТР 
              
             if(!OrderSend(Symbol(),OP_BUY,OOL,OOP,slippage,0,OTP,"",Magic,0,Aqua))// Установка ордера не для ECN счета!!! 
              Print("Ошибка установки ордера BUY, код ошибки - ",GetLastError());  // если ордер не установился, узнаем по какой ошибке 
           } 
        } 
//--------------------------     
       if(LastType==OP_SELL)                                          // если последний ордер SELL  
        {                                                             // 
          if(Bid>=LastOpenPr+Mpip*Point)                              // проверим на условие дистанции 
           {                                                          // если условие выполняется - установим новый ордер 
             double OOL = NormalizeDouble(LastLot*LotExp,dec);        // зададим лот 
             double OOP = NormalizeDouble(Bid,Digits);                // зададим цену открытия 
             double OTP = NormalizeDouble(Bid-TP*Point,Digits);       // зададим значение ТР 
              
             if(!OrderSend(Symbol(),OP_SELL,OOL,OOP,slippage,0,OTP,"",Magic,0,Aqua))// Установка ордера не для ECN счета!!! 
              Print("Ошибка установки ордера SELL, код ошибки - ",GetLastError());  // если ордер не установился, узнаем по какой ошибке
           } 
        } 
     } 
  }    
//--------------------------------------end---------------------------------------

Таки мой косяк, что-то я решил, что вторую пару переменных, расположенных в других скобках, компилятор не увидит, а нет. Но, как говориться, писалось на коленке...
Исправил, заодно убрал два предупреждения, файл прилагаю.

как вы делаете текст кода свернутым? - выделяем нужный кусок текста - и под споллер его, см. скрин.
PHP:
extern int       dec=1;
extern int       TP=10;
extern double    Lots=0.6;       
extern int       MaxOrders=10;
//--------------------------------
extern int       Per=20;
//---------------------------------
extern bool      MARTINGAYL=true;
extern int       Mpip=1;
extern int       LotExp=1;
//---------------------------------
extern int       slippage=3;
extern int       Magic=123;

int init()
  {

  return(0);
  }

int deinit(){
   return(0);
  }
//--------------------------------------------------------------------------------+
int start()
{
if(MARTINGAYL)Martin();
//-----------------------
RefreshRates();
double ma=iMA(Symbol(),0,Per,0,3,0,0);
//-----------------------------
if(OrdersTotal()<MaxOrders)
 {
//-----------------------------1---------------------------------------------------+
  if(Ask < ma)
   {
     if(!OrderSend(Symbol(),OP_BUY,Lots,Ask,slippage,0,Ask+TP*Point,"",Magic,0,Aqua))
       Print("Ошибка установки ордера BUY, код ошибки - ",GetLastError());
   }
//---------------------------
  if(Bid > ma)
   {
     if(!OrderSend(Symbol(),OP_SELL,Lots,Bid,slippage,0,Bid-TP*Point,"",Magic,0,Magenta))
       Print("Ошибка установки ордера SELL, код ошибки - ",GetLastError());
   }
//----------------------------------------------------------------------------------+
}
return(0);
}

//------------------------------------MARTINGAYL-------------------------------------------------------+
void Martin() 
  { 
    int    LastTicket = 0; 
    int    LastType   =-1; 
    double LastOpenPr = 0; 
    double LastLot    = 0; 
//---------------------------------------
    for(int i=OrdersTotal()-1;i>=0; i--)  
     {  
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))                 // Проверяем только рыночные ордера 
        {                                                             // 
          if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)    // Только по данному символу с заданным меджиком 
           {                                                          // 
             if(OrderType()==OP_BUY || OrderType()==OP_SELL)          // Проверку производим только по ордерам BUY/SELL 
              {                                                       // 
                if(LastTicket<OrderTicket())                          // Если тикет найденного ордера больше за предыдущий 
                 {                                                    // значит он последний среди уже проверенных 
                   LastTicket = OrderTicket();                        // запомним его значение 
                   LastType   = OrderType();                          // запомним его тип  
                   LastOpenPr = OrderOpenPrice();                     // запомним его цену открытия 
                   LastLot    = OrderLots();                          // и запомним его лот 
                 } 
              }  
           } 
        } 
     }   
//---------------------------   
    if(LastTicket==0) return;                                         // Перебрали все ордера, если LastTicket=0 - ордеров 
                                                                      // в рынке нет - выход из функции  
    double OOL = 0;
    double OOP = 0;
    double OTP = 0;
    
    if(LastType!=-1 && LastOpenPr!=0 && LastLot!=0)                   // иначе проверим наличие полученных данных 
     {                                                                // 
       if(LastType==OP_BUY)                                           // если последний ордер BUY  
        {                                                             // 
          if(Ask<=LastOpenPr-Mpip*Point)                              // проверим на условие дистанции 
           {                                                          // если условие выполняется - установим новый ордер 
             OOL = NormalizeDouble(LastLot*LotExp,dec);               // зададим лот 
             OOP = NormalizeDouble(Ask,Digits);                       // зададим цену открытия 
             OTP = NormalizeDouble(Ask+TP*Point,Digits);              // зададим значение ТР 
              
             if(!OrderSend(Symbol(),OP_BUY,OOL,OOP,slippage,0,OTP,"",Magic,0,Aqua))// Установка ордера не для ECN счета!!! 
              Print("Ошибка установки ордера BUY, код ошибки - ",GetLastError());  // если ордер не установился, узнаем по какой ошибке 
           } 
        } 
//--------------------------     
       if(LastType==OP_SELL)                                          // если последний ордер SELL  
        {                                                             // 
          if(Bid>=LastOpenPr+Mpip*Point)                              // проверим на условие дистанции 
           {                                                          // если условие выполняется - установим новый ордер 
             OOL = NormalizeDouble(LastLot*LotExp,dec);               // зададим лот 
             OOP = NormalizeDouble(Bid,Digits);                       // зададим цену открытия 
             OTP = NormalizeDouble(Bid-TP*Point,Digits);              // зададим значение ТР 
              
             if(!OrderSend(Symbol(),OP_SELL,OOL,OOP,slippage,0,OTP,"",Magic,0,Aqua))// Установка ордера не для ECN счета!!! 
              Print("Ошибка установки ордера SELL, код ошибки - ",GetLastError());  // если ордер не установился, узнаем по какой ошибке
           } 
        } 
     } 
  }    
//--------------------------------------end---------------------------------------
 

Вложения

  • _SPL.png
    _SPL.png
    136 КБ · Просмотры: 24

Milord

Местный знаток
Таки мой косяк, что-то я решил, что вторую пару переменных, расположенных в других скобках, компилятор не увидит, а нет. Но, как говориться, писалось на коленке...
Исправил, заодно убрал два предупреждения, файл прилагаю.
ну вот отлично,спасибо за помощь,теперь 0 ошибок и 0 предупреждений,будем посмотреть что за зверь этот мартини;)

на счет спойлера спасибо,будем знать, а чем отличаются между собой функционально эти кнопки - та и та спойлер делает вроде?

еще вопрос -как можно прописать в коде запоминание переменной в какое то время,например переменная P меняется все время,а мне надо ее запомнить в константе K,как это сделать не могу понять,
если написать
PHP:
int init() 
  { 

  return(0); 
  } 

int deinit(){ 
   return(0); 
  } 
//---
int start() 
{
 if(A>B) int K=P;

return(0); 
}
//-------------end--------
то и константа тоже будет все время менять свои значения..:facepalm:
 

Вложения

  • Screenshot - 01_06 002.jpg
    Screenshot - 01_06 002.jpg
    1,4 КБ · Просмотры: 95
Последнее редактирование:

mobidik

-----
ну вот отлично,спасибо за помощь,теперь 0 ошибок и 0 предупреждений,будем посмотреть что за зверь этот мартини;)

на счет спойлера спасибо,будем знать, а чем отличаются между собой функционально эти кнопки - та и та спойлер делает вроде?

еще вопрос -как можно прописать в коде запоминание переменной в какое то время,например переменная P меняется все время,а мне надо ее запомнить в константе K,как это сделать не могу понять,
если написать
PHP:
int init() 
  { 

  return(0); 
  } 

int deinit(){ 
   return(0); 
  } 
//---
int start() 
{
 if(A>B) int K=P;

return(0); 
}
//-------------end--------
то и константа тоже будет все время менять свои значения..:facepalm:

На счет второго варианта споллера - не вникал, быть может кто-то другой прояснит это.
На счет запомнить значение:
1) объявить переменную int P; на глобальном уровне.
2) в ф-ции OnInit() задать ей начальное значение, Р = 0;
3) в ф-ции OnTick() задать условие по которому будем что-то запоминать.
Если объявить переменную Р в этой ф-ции или производить её инициализацию, тогда на каждом тике она будет сбрасываться в исходное состояние. Но можно использовать оператор static, тогда будет работать как надо. (см. справку). static int P=0;
А вот в создании условия, нужно продумать его реализацию в зависимости от того, что хотим получить и в какой момент. Примером может быть любой сигнал алерта в индикаторах - сигналит только на первом тике бара, все остальные тики по текущему бару игнорируются. Можно использовать флаги - произошло событие, флаг имеет состояние "А" - значит можем запомнить значение и изменяем состояние флага на "В". Теперь, сколько бы раз выполнялось условие - новая запись не произойдет до тех пор, пока не изменим состояние флага на "А", а это, так же, нужно предусмотреть, но уже в другом условии. Если флаг имеет значение "В" и произошло событие такое-то - флаг установили в состояние "А". Теперь можем при наступлении нового события снова запомнить нужное значение.
 

AlexeyVik

Программист mql4 mql5
На счет второго варианта споллера - не вникал, быть может кто-то другой прояснит это.
Ничего сложного.
Первый вариант спойлера.
Второй вариант спойлера.
 

Milord

Местный знаток
На счет второго варианта споллера - не вникал, быть может кто-то другой прояснит это.
На счет запомнить значение:
1) объявить переменную int P; на глобальном уровне.
2) в ф-ции OnInit() задать ей начальное значение, Р = 0;
3) в ф-ции OnTick() задать условие по которому будем что-то запоминать.
Если объявить переменную Р в этой ф-ции или производить её инициализацию, тогда на каждом тике она будет сбрасываться в исходное состояние. Но можно использовать оператор static, тогда будет работать как надо. (см. справку). static int P=0;
А вот в создании условия, нужно продумать его реализацию в зависимости от того, что хотим получить и в какой момент. Примером может быть любой сигнал алерта в индикаторах - сигналит только на первом тике бара, все остальные тики по текущему бару игнорируются. Можно использовать флаги - произошло событие, флаг имеет состояние "А" - значит можем запомнить значение и изменяем состояние флага на "В". Теперь, сколько бы раз выполнялось условие - новая запись не произойдет до тех пор, пока не изменим состояние флага на "А", а это, так же, нужно предусмотреть, но уже в другом условии. Если флаг имеет значение "В" и произошло событие такое-то - флаг установили в состояние "А". Теперь можем при наступлении нового события снова запомнить нужное значение.

не могли бы вы показать на примере того куска кода что я давал в своем примере,как запомнить переменную P, при выполнении условия ,в константе K, а то мне лучше один раз увидеть в коде, чем сто раз прочесть про флаги, для меня флаг это знамя;) уж извините за ассоциации...ну еще сложность с новыми билдами,я то еще в старом сижу в 509, где не было OnTick(), а был Start() или это по сути синонимы, если писать под новый билд просто менять их и все?;)

переменную P не надо приравнивать к нулю, это по сути сигнал,например с индикатора,и мне его нужно запомнить при условии, что в скобках, то есть записать его значение в переменную или константу K, запутался уже с этими названиями:facepalm:
все ж таки рискну написать в старом билде, чтобы не путаться, если я правильно вас понял ,то код будет такой?
но на каждом тике мы имеем разное значение K, если условие выполняется, а мне надо запомнить первое значение при выполнении условия в 1-й раз, и далее чтобы уже ничто не влияло на значение К, чтобы там было тоже самое число!
может я торможу сильно...:facepalm:
PHP:
int init()  
  {  
  int K=0;
  return(0);  
  }  

int deinit(){  
   return(0);  
  }  
//--- 
int start()  
{ 
 if(A>B) K=P; 

return(0);  
} 
//-------------end--------
 
Последнее редактирование:

sergeysv

Активный участник
Подскажите пожалуйста где ошибка и как её исправить чтоб закрыть половину лота кнопкой "PullZAKR" ??? :facepalm:
Всё заглушенное перепробовал ...с разных сторон....с разными словами:)
 

Вложения

  • 888.mq4
    14,5 КБ · Просмотры: 17

Milord

Местный знаток
Проггеры, гляньте задачку,для вас думаю легкота..

переменную P не надо приравнивать к нулю, это по сути сигнал,например с индикатора,и мне его нужно запомнить при условии, что в скобках, то есть записать его значение в переменную или константу K, запутался уже с этими названиями:facepalm:
все ж таки рискну написать в старом билде, чтобы не путаться, если я правильно вас понял ,то код будет такой?
PHP:
int init()  
  {  
  int K=0;
  return(0);  
  }  

int deinit(){  
   return(0);  
  }  
//--- 
int start()  
{ 
 if(A>B) K=P; 

return(0);  
} 
//-------------end--------
но на каждом тике мы имеем разное значение K, если условие выполняется, а мне надо запомнить первое значение при выполнении условия в 1-й раз, и далее чтобы уже ничто не влияло на значение К, чтобы там было тоже самое число!
может я торможу сильно...:facepalm:

или наверно вот так надо делать,код ниже,тут как раз при запуске советника и записывается значение Р,которое потом не меняется в К, что его хранит,верно?
PHP:
int init()  
  {  
  int K=0;
  if(A>B) K=P;
  return(0);  
  }  
//---------
int deinit(){  
   return(0);  
  }  
//--- 
int start()  
{ 

return(0);  
} 
//-------------end--------
 
Последнее редактирование:

mobidik

-----
не могли бы вы показать на примере того куска кода что я давал в своем примере,как запомнить переменную P, при выполнении условия ,в константе K, а то мне лучше один раз увидеть в коде, чем сто раз прочесть про флаги, для меня флаг это знамя;) уж извините за ассоциации...ну еще сложность с новыми билдами,я то еще в старом сижу в 509, где не было OnTick(), а был Start() или это по сути синонимы, если писать под новый билд просто менять их и все?;)

переменную P не надо приравнивать к нулю, это по сути сигнал,например с индикатора,и мне его нужно запомнить при условии, что в скобках, то есть записать его значение в переменную или константу K, запутался уже с этими названиями:facepalm:
все ж таки рискну написать в старом билде, чтобы не путаться, если я правильно вас понял ,то код будет такой?
но на каждом тике мы имеем разное значение K, если условие выполняется, а мне надо запомнить первое значение при выполнении условия в 1-й раз, и далее чтобы уже ничто не влияло на значение К, чтобы там было тоже самое число!
может я торможу сильно...:facepalm:
PHP:
int init()  
  {  
  int K=0;
  return(0);  
  }  

int deinit(){  
   return(0);  
  }  
//--- 
int start()  
{ 
 if(A>B) K=P; 

return(0);  
} 
//-------------end--------

или наверно вот так надо делать,код ниже,тут как раз при запуске советника и записывается значение Р,которое потом не меняется в К, что его хранит,верно?
PHP:
int init()  
  {  
  int K=0;
  if(A>B) K=P;
  return(0);  
  }  
//---------
int deinit(){  
   return(0);  
  }  
//--- 
int start()  
{ 

return(0);  
} 
//-------------end--------

Все не верно. На счет того, что "переменную P не надо приравнивать к нулю" - ей все равно нужно задать какое-то начальное значение, иначе компилятор может ругнуться на неё, выдаст предупреждение.
Теперь по сути Вашего кода: по варианту if(A>B) K=P; - если "Р" имеет значение, например, текущей цены, тогда всегда, когда верно условие будет перезаписываться переменная "К" новым, текущим значением. По второму варианту, где значение определяется в ф-ции init() - значение запишется только в момент установки советника/индикатора на график и изменит свое состояние если войти в настройки и нажать кнопку "Ok".
Ниже прилагаю вариант кода с флагом. Как только RSIпересекает уровень 30/70 - запоминаем текущие значение цены. Но, обрати внимание, если за комментировать строку: if(RSI > 30 && RSI < 70) Flag = 0; и как только произойдет, например, пересечение уровня 70, то значение в переменной Data измениться только при пересечении уровня 30, т.е., при первом пересечении уровня 70 будет запомнено значение и если индикатор выйдет из уровня 70, не дойдет до уровня 30 и вернется обратно, пересечет уровень 70 - новое значение не будет записано в переменную Data. Если указанную строку оставить как есть, то значение будет записываться при каждом пересечении любого уровня.
Надеюсь, понятно расписал.
PHP:
//+------------------------------------------------------------------+
//|                                                    TEST_Flag.mq4 |
//|                                                          Mobidik |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Mobidik"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

int      Flag;
double   Data;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
    Flag = 0;
    Data = 0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
     double RSI = iRSI(NULL,0,3,PRICE_CLOSE,1);
     string msg = "RSI находиться между уровнями.";
     
     if(RSI > 70 && Flag!=1) 
      {
        Data = Close[0];
        Flag = 1;
      }
        
     if(RSI < 30 && Flag!=-1)
      {
        Data = Close[0];
        Flag = -1;
      }  
//---
    if(RSI > 30 && RSI < 70) Flag = 0;
//---
    if(Flag== 1) msg = "RSI находиться выше уровня 70.";
    if(Flag==-1) msg = "RSI находиться ниже уровня 30.";
//---
    Comment(
    "\n   RSI = ",DoubleToStr(RSI,1),
    "\n   Data = ",DoubleToStr(Data,Digits),
    "\n   Flag = ",IntegerToString(Flag),
    "\n   ",msg
    );
  }
//+------------------------------------------------------------------+

PS.
... сам потерял малость форму в кодировании, половину позабыл что знал из-за большого перерыва,остальную половину по сей день осваиваю..;)
Подобные вопросы довольно таки странно слышать от человека который когда-то что-то делал, пусть и давно, это элементарные вещи. Это все равно, что если в детстве умел кататься на велосипеде, то и 50 поедешь...

И еще одно - ЗАБУДЬТЕ ВСЕ о 509 билде, осваивайте "новый", (хотя, какой он "новый", уже 4 года...) посмотрите, когда было последнее обновление терминала МТ4 - уже больше года назад. Сами метаквоты заявили, что не будут больше его поддерживать. Стоит уже переходить на МТ5, а Вы все где-то там, в истории остаетесь, потом придется все по новой, а переход с нового билда на МТ5 будет проще, имхо.
 
Последнее редактирование:

Milord

Местный знаток
.....И еще одно - ЗАБУДЬТЕ ВСЕ о 509 билде, осваивайте "новый", (хотя, какой он "новый", уже 4 года...) посмотрите, когда было последнее обновление терминала МТ4 - уже больше года назад. Сами метаквоты заявили, что не будут больше его поддерживать. Стоит уже переходить на МТ5, а Вы все где-то там, в истории остаетесь, потом придется все по новой, а переход с нового билда на МТ5 будет проще, имхо.

спасибо за помощь в написании кода!

п.с.
так как же мне забыть 509 билд, если вы не ответили как перейти на новый,насколько я понял в старом и новом отличия небольшие по структуре кода, я имею ввиду названия главных функций или разделов,как они правильно называются,непомню..
PHP:
int init() - int OnInit()
int deinit() - void OnDeinit()
int start() - void OnTick()

верно?
тогда риторический вопрос - зачем было менять названия этих функций в новых билдах, если их функции не изменились вапще,извините за тавтологию..

п.п.с.
Подобные вопросы довольно таки странно слышать от человека который когда-то что-то делал, пусть и давно, это элементарные вещи. Это все равно, что если в детстве умел кататься на велосипеде, то и 50 поедешь..."

у меня тот случай - когда незнал,да еще забыл:D

а если серьезно,то навыки написания кода быстро теряются,при длительном перерыве в полгода или год,смотришь на свои творения что сам же писал, и удивляешься как мог писать такие сложные вещи..
это вам не на велике кататься,где мышечная память не пропадает никогда!
 
Последнее редактирование:

vladradon

Программист
так как же мне забыть 509 билд, если вы не ответили как перейти на новый,насколько я понял в старом и новом отличия небольшие по структуре кода, я имею ввиду названия главных функций или разделов,как они правильно
А вообще какой смысл что-то писать на старых билдах? На последних все прекрасно работает. Это если использовать закрытый код, который был скмпилирован на таких старых билдах, тогда хоть какой-то есть смысл, но это в случае использования какого-то древнего индюка, чей открытый код не известен и его автор не переписал код под последние билды. Объясни хоть в чем у тебя необходимость использовать именно старый билд.
 

MrGreen86

Гуру форума
Подскажите пожалуйста где ошибка и как её исправить чтоб закрыть половину лота кнопкой "PullZAKR" ??? :facepalm:
Всё заглушенное перепробовал ...с разных сторон....с разными словами:)

зачем же вы все глушить пробовали? )
вот это глушить было нельзя:
Kol=StringSubstr(sparamA, 6,0);
этой трокой определяется порядковый номер ордера который нужно закрыть. как именно? у вас обьекты имеют названия:
CLOSED1
CLOSED2
CLOSED3
...
PullZAKR1
PullZAKR2
PullZAKR3
...

на конце названия объекта кнопки и есть искомый номер ордера который вы храните в массивах.
функция StringSubStr верезает из строки (названия обьекта) какую то часть.
StringSubstr(sparamA, 6,0); вырежет все начиная с 6го символа. это правильно для CLOSED1, так как первые 6 символов у нас "CLOSED" а 1 это то что мы ищем.

Но вы тоже самое применяете и к "PullZAKR"
что происходит?
например вы нажали на кнопку "PullZAKR1"
функция StringSubstr(sparamA, 6,0); вам вернет что? "KR1"
тут нужно сделать StringSubstr(sparamA, 8,0);
тогда будет все правильно.

P.S. компилятор не скомпилирует ваш код с лишней запятой )
 

Milord

Местный знаток
А вообще какой смысл что-то писать на старых билдах? На последних все прекрасно работает.....Объясни хоть в чем у тебя необходимость использовать именно старый билд.

тут дело не в необходимости, а в привычке,90% пользователей были против изменения структуры кода новых билдов,поскольку многие советники и индикаторы без переписания кода не работали на них,но как всем известно метаквотам глубоко плевать было на это,они выпускали новые билды каждую неделю почти, а в итоге сказали, что они и МТ4 не станут больше поддерживать, якобы это вчерашний день, по их мнению будущее за картинками в терминале, а не за минимальные украшательства, в пользу легкости освоения языка и его возможностей...:facepalm:

берем например МТ4,билд 1090,из последних, что мы видим ниже строки открытых ордеров
баланс-средства-маржа-свободная маржа-уровень,
а слабо было написать по нормальному
Balance-Equity-Profit-Margin-FreeMargin,чтобы профит можно было по желанию видеть или в валюте счета или в % от баланса

P.S.
повторяю всем проггерам вопрос, кто пишет в новых билдах МТ4 редактора -насколько я понял в старом и новом билдах отличия небольшие по структуре кода, я имею ввиду названия главных функций или разделов,как они правильно называются,непомню..

PHP:
int init() - int OnInit()
int deinit() - void OnDeinit()
int start() - void OnTick()

верно?
тогда риторический вопрос - зачем было менять названия этих функций в новых билдах, если их функции не изменились вапще,извините за тавтологию..
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
тут дело не в необходимости, а в привычке,90% пользователей были против изменения структуры кода новых билдов,поскольку многие советники и индикаторы без переписания кода не работали на них,но как всем известно метаквотам глубоко плевать было на это,они выпускали новые билды каждую неделю почти, а в итоге сказали, что они и МТ4 не станут больше поддерживать, якобы это вчерашний день, по их мнению будущее за картинками в терминале, а не за минимальные украшательства, в пользу легкости освоения языка и его возможностей...:facepalm:

берем например МТ4,билд 1090,из последних, что мы видим ниже строки открытых ордеров
баланс-средства-маржа-свободная маржа-уровень,
а слабо было написать по нормальному
Balance-Equity-Profit-Margin-FreeMargin,чтобы профит можно было по желанию видеть или в валюте счета или в % от баланса

P.S.
повторяю всем проггерам вопрос, кто пишет в новых билдах МТ4 редактора -насколько я понял в старом и новом билдах отличия небольшие по структуре кода, я имею ввиду названия главных функций или разделов,как они правильно называются,непомню..

PHP:
int init() - int OnInit()int deinit() - void OnDeinit()int start() - void OnTick()
верно?
тогда риторический вопрос - зачем было менять названия этих функций в новых билдах, если их функции не изменились вапще,извините за тавтологию..
Что-то примерно так как на скрине?


Зачем меняли? Да, видимо, просто так захотели... А какая проблема в написании? Что касается типов функций, то тут есть логика. Зачем писать int deinit() и возвращать из неё 0 если проще назначить ей тип void и ничего не возвращать за ненадобностью. Так-же и с функцией void OnTick(). Хотя здесь есть ещё смысловой аспект. Если функция срабатывает по приходу нового тика, то разумней назвать её именно в зависимости от тика. В скриптах логично звучит void OnStart(), а индикаторах пересчитать, независимо от того, что работает эта функция так-же по приходу нового тика. Плюс ко всему открыв код по названиям этих функций сразу видно скрипт это или индикатор.


Зачем возмущаться тем что идёт дождь? Сколько не возмущайся он всё равно будет идти...
 

Вложения

  • 000.png
    000.png
    2 КБ · Просмотры: 10

vladradon

Программист
повторяю всем проггерам вопрос, кто пишет в новых билдах МТ4 редактора -насколько я понял в старом и новом билдах отличия небольшие по структуре кода, я имею ввиду названия главных функций или разделов,как они правильно называются,непомню..

PHP код:
int init() - int OnInit()
int deinit() - void OnDeinit()
int start() - void OnTick()
верно?
тогда риторический вопрос - зачем было менять названия этих функций в новых билдах, если их функции не изменились вапще,извините за тавтологию..
Во первых все старые функции без проблем компилируются в новых билдах. Новые появились после объединения 4-го и 5-го языков и может и была идея все переделать в один язык под один терминал, но все на данный момент остановилось на том, что и все старое и все привнесенное из 5-ки на 4-ке работает. В 4-ке появился режим компиляции strict, при котором производится более углубленная проверка кода и она включается как доп команда. Короче все работает и я не мало старых прог переписал под новые билды и сложного там ничего нет.
 

MrGreen86

Гуру форума
тут дело не в необходимости, а в привычке,90% пользователей были против изменения структуры кода новых

категорически не согласен с вами. любой нормальный код написанный на старый билд без труда компилируется на новом без каких либо изменений вообще. те же названные фами функции init() start() deinit() продолжают работать в новом билде и компилятор даже не выдает никаких предупреждений.
Вот если код был написан пьяными индусами - да появлялись проблемы... которые у слову решались в самых запущенных случаях минут за 5.

MQ да как то ляпнули мол mt4 устарел и поддерживать больше не будем, но пользователи проголосовали иначе. На моей практике как было года 3-4 назад заказов на mql5 в районе 5-10%, так и осталось. По этому у MQ не осталось выбора как расширить язык mql4 до приемлемого уровня, появилось долгожданное ООП. Но они не оставляют попыток пропихнуть mql5, потому и были реализованы хедж счета. Хотя все профессиональные участники прекрасно понимают что это абсолютно бесполезная фича. Но у большинства пользовалетей все было очень плохо с математикой в школе и они любят хеджироваться на той же паре копя комиссии и свопы себе в убыток :D

Никаких проблем для освоения и использования языка не появилось. Учебник который у них висит на сайте с хрен знает каких годов до сих пор актуален и все что написано в нем прекрасно работает.
 
Верх