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

vladradon

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

Кузя

Интересующийся
Как прописать условия входа в сделку по стрелке.

Здравствуйте!Дело в том,что я только начал изучать MQL4.У меня ещё каша в голове от количества информации.У меня есть шаблон для написания советников.Но я ещё не всё могу сообразить как прописывать условия.Помогите,пожалуйста.Чисто для примера покажите как правильно прописать покупку и продажу по этому индикатору.По стрелкам,которые он ставит.Шаблон и индикатор прилагаю.Я так быстрей врублюсь как это делается.Спасибо за понимание!
 

Вложения

  • V_Arrows_V2.mq4
    2,9 КБ · Просмотры: 38
  • Templates(Arrows_V2).mq4
    126,3 КБ · Просмотры: 31

Anton567777

Новичок форума
Здравствуйте!Дело в том,что я только начал изучать MQL4.У меня ещё каша в голове от количества информации.У меня есть шаблон для написания советников.Но я ещё не всё могу сообразить как прописывать условия.Помогите,пожалуйста.Чисто для примера покажите как правильно прописать покупку и продажу по этому индикатору.По стрелкам,которые он ставит.Шаблон и индикатор прилагаю.Я так быстрей врублюсь как это делается.Спасибо за понимание!

А где сам то индикатор. Шаблон это советник, а V_Arrows_V2 это индикатор ???, как я понимаю, да там пару строк кода и нет никаких буферов для отображения стрелок, как он их выставляет???
 

warwick

Активный участник
Подскажите кусок кода для советника. В заданное мною время Х часов Х минут открывал ордер Х объемом, на селл или бай(выбор) и мейджик.
 

Fgslm

Интересующийся
Код

Подскажите
Есть код
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
//---- input parameters
extern int period=144;
extern int method=3; // MODE_SMA
extern int price=0; // PRICE_CLOSE
//---- buffers
double Uptrend[];
double Dntrend[];
double ExtMapBuffer[];


//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(3);
SetIndexBuffer(0, Uptrend);
//ArraySetAsSeries(Uptrend, true);
SetIndexBuffer(1, Dntrend);
//ArraySetAsSeries(Dntrend, true);
SetIndexBuffer(2, ExtMapBuffer);
ArraySetAsSeries(ExtMapBuffer, true);

SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,2);

IndicatorShortName("Hull Moving Average("+period+")");
return(0);
}

//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
// ???? ????? ?????? ??????
return(0);
}

//+------------------------------------------------------------------+
//| ?????????? ??????? |
//+------------------------------------------------------------------+
double WMA(int x, int p)
{
return(iMA(NULL, 0, p, 0, method, price, x));
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars = IndicatorCounted();

if(counted_bars < 0)
return(-1);

int x = 0;
int p = MathSqrt(period);
int e = Bars - counted_bars + period + 1;

double vect[], trend[];

if(e > Bars)
e = Bars;

ArrayResize(vect, e);
ArraySetAsSeries(vect, true);
ArrayResize(trend, e);
ArraySetAsSeries(trend, true);

for(x = 0; x < e; x++)
{
vect[x] = 2*WMA(x, period/2) - WMA(x, period);
// Print("Bar date/time: ", TimeToStr(Time[x]), " close: ", Close[x], " vect[", x, "] = ", vect[x], " 2*WMA(p/2) = ", 2*WMA(x, period/2), " WMA(p) = ", WMA(x, period));
}

for(x = 0; x < e-period; x++)

ExtMapBuffer[x] = iMAOnArray(vect, 0, p, 0, method, x);

for(x = e-period; x >= 0; x--)
{
trend[x] = trend[x+1];
if (ExtMapBuffer[x]> ExtMapBuffer[x+1]) trend[x] =1;
if (ExtMapBuffer[x]< ExtMapBuffer[x+1]) trend[x] =-1;

if (trend[x]>0)
{ Uptrend[x] = ExtMapBuffer[x];
if (trend[x+1]<0) Uptrend[x+1]=ExtMapBuffer[x+1];
Dntrend[x] = EMPTY_VALUE;
}
else
if (trend[x]<0)
{
Dntrend[x] = ExtMapBuffer[x];
if (trend[x+1]>0) Dntrend[x+1]=ExtMapBuffer[x+1];
Uptrend[x] = EMPTY_VALUE;
}

//Print( " trend=",trend[x]);
}

return(0);
}
//+------------------------------------------------------------------+
Куда и что прикрутить(с чего начать) чтобы индикатор ставил отметки на расстоянии N свечей от точки смены тенденции над ценой N-й свечи?
где-то вначале должна быть срока
extern int numberofbars=5; //количество бар от точки смены тренда
далее
1.-При Buy (смена цвета линии на синий) определяется текущая цена А1. От текущей свечи отсчитывается "numberofbars" N бар и по его закрытию определяется цена А2.
Если цена А2 больше А1, над свечой N рисуется зеленый крестик.
Если цена А2 меньше А1, над свечой N рисуется красный крестик.
2.-При Sell (смена цвета линии на красный) определяется текущая цена В1. От текущей свечи отсчитывается "numberofbars" N бар и по его закрытию определяется цена B2.
Если цена B2 меньше В1, под свечой N рисуется зелёный крестик.
Если цена В2 больше В1, под свечой N рисуется красный крестик.

Как прописать такое в коде?
 
Последнее редактирование:

eevviill2

Местный знаток
Подскажите кусок кода для советника. В заданное мною время Х часов Х минут открывал ордер Х объемом, на селл или бай(выбор) и мейджик.
PHP:
extern string start_time = "08:00";
 int time_shift;
 bool first_tick_chaked=false;
//////////////////////////////////////////////////////////////
 int OnInit()
 {  
  first_tick_chaked=false;
 return(INIT_SUCCEEDED);
 }
 ////////////////////////////////////////////////////////////
 void OnTick()
 { 
 if(!first_tick_chaked)
 {
 first_tick_chaked=true;
EventSetTimer(1);
 time_shift=int(TimeLocal()-TimeCurrent());
 }
}
////////////////////////////////////////////////////////////
 void OnTimer()
 {
 string TC_s=TimeToString(TimeLocal()-time_shift,TIME_MINUTES);
    if(OrdersTotal()==0 && TC_s==start_time) OrderSend(...);
 }
 

Milord

Местный знаток
Спецы по языку MQL4 - подскажите как написать код?

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

PHP:
extern int       MaxOrdersBUY=1;
extern int       MaxOrdersSELL=1;
//-------------------------------
int start()
{
//-------------------------------
 if(A>B)
  {
  OrderSend(Symbol(),OP_SELL,...);
  {
  if(A<B)
  { 
  OrderSend(Symbol(),OP_BUY,...);
  } 
//-------------------------------
}
 

mobidik

-----
суть в следующем, нужно разделить максимальное число ордеров - отдельно по бай и селл,как это сделать,не могу понять,и желательно в старом 509 билде,новые еще не освоил..;)
для ясности привожу кусок кода,куда нужно втиснуть нужный код:
PHP:
extern int       MaxOrdersBUY=1;
extern int       MaxOrdersSELL=1;
//-------------------------------
int start()
{
//-------------------------------
 if(A>B)
  {
  OrderSend(Symbol(),OP_SELL,...);
  {
  if(A<B)
  { 
  OrderSend(Symbol(),OP_BUY,...);
  } 
//-------------------------------
}

Как вариант:
PHP:
//+------------------------------------------------------------------+
extern int       MaxOrdersBUY  = 1; 
extern int       MaxOrdersSELL = 1; 
//+------------------------------------------------------------------+ 
int start() 
  {  
    int cnt_b = CountOrder(OP_BUY);
    int cnt_s = CountOrder(OP_SELL);
 
    if(A>B && cnt_b<MaxOrdersBUY) 
     { 
       OrderSend(Symbol(),OP_SELL,...); 
     { 
    if(A<B && cnt_s<MaxOrdersSELL) 
     {  
       OrderSend(Symbol(),OP_BUY,...); 
     } 
  //***************
  }
//+------------------------------------------------------------------+
//| Count Order Type                                                 |
//+------------------------------------------------------------------+
int CountOrder(int type)
  {
    int i,cnt = 0;
    
    for(i=0; i<OrdersTotal(); i++)
     {    
       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
          if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
             if(OrderType()==type)  cnt++;
           }
        }     
     }
    return(cnt);
  }
//+------------------------------------------------------------------+
 

vladradon

Программист
Как вариант:
PHP код:
//+------------------------------------------------------------------+
extern int MaxOrdersBUY = 1;
extern int MaxOrdersSELL = 1;
//+------------------------------------------------------------------+
int start()
{
int cnt_b = CountOrder(OP_BUY);
int cnt_s = CountOrder(OP_SELL);

if(A>B && cnt_b<MaxOrdersBUY)
{
OrderSend(Symbol(),OP_SELL,...);
{
if(A<B && cnt_s<MaxOrdersSELL)
{
OrderSend(Symbol(),OP_BUY,...);
}
//***************
}
//+------------------------------------------------------------------+
//| Count Order Type |
//+------------------------------------------------------------------+
int CountOrder(int type)
{
int i,cnt = 0;

for(i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==type) cnt++;
}
}
}
return(cnt);
}
//+------------------------------------------------------------------+
Привет! Ты опередил меня на несколько секунд!;):D
PHP:
int start() 
{ 
double OrdersBuy=0, OrdersSell=0;
for(int i=0;i<OrdersTotal();i++)
  if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES && OrderSymbol()==_Symbol))
    {
     if(OrderType()==OP_BUY) OrdersBuy++;
     if(OrderType()==OP_SELL) OrdersSell++;
    }
//------------------------------- 
 if(A>B && OrdersSell<MaxOrdersSELL) 
  { 
  OrderSend(Symbol(),OP_SELL,...); 
  } 
  if(A<B && OrdersBuy<MaxOrdersBUY) 
  {  
  OrderSend(Symbol(),OP_BUY,...); 
  }
Выложу уж тоже.
 
Последнее редактирование:

Milord

Местный знаток
Спецы по языку MQL4 - снова вам вопросик, подскажите как написать?

возник схожий вопрос с предыдущим, сам не могу понять, давно не смотрел код, малость "форму" потерял..;)
суть такая, нужно разделить по магику ордера, чтобы максимальное число открытых ордеров в каждом магике было своё,без разницы какой тип открытого ордера,ниже примерный кусок кода,куда нужно втиснуть нужный код(всем заранее спасибо!):

PHP:
extern int       MaxOrdersMagic1=1;
 extern int       MaxOrdersMagic2=1;
//--------------------------------------------------
int start()
{
//------
 if(A>B)
   {
   OrderSend(Symbol(),OP_BUY,...,Magic1,...);
   }  
 if(A<B)
   {
   OrderSend(Symbol(),OP_SELL,...,Magic1,...);
   }
//---------------------------------------------------
 if(C>D)
   {
   OrderSend(Symbol(),OP_BUY,...,Magic2,...);
   }  
 if(C<D)
   {
   OrderSend(Symbol(),OP_SELL,...,Magic2,...);
   }
//------
}
 

mobidik

-----
возник схожий вопрос с предыдущим, сам не могу понять, давно не смотрел код, малость "форму" потерял..;)
суть такая, нужно разделить по магику ордера, чтобы максимальное число открытых ордеров в каждом магике было своё,без разницы какой тип открытого ордера,ниже примерный кусок кода,куда нужно втиснуть нужный код(всем заранее спасибо!):

PHP:
extern int       MaxOrdersMagic1=1;
 extern int       MaxOrdersMagic2=1;
//--------------------------------------------------
int start()
{
//------
 if(A>B)
   {
   OrderSend(Symbol(),OP_BUY,...,Magic1,...);
   }  
 if(A<B)
   {
   OrderSend(Symbol(),OP_SELL,...,Magic1,...);
   }
//---------------------------------------------------
 if(C>D)
   {
   OrderSend(Symbol(),OP_BUY,...,Magic2,...);
   }  
 if(C<D)
   {
   OrderSend(Symbol(),OP_SELL,...,Magic2,...);
   }
//------
}

На основе ранее представленного кода:
надеюсь, смысл понятен, а все остальное зависит от составления условия...
PHP:
//+------------------------------------------------------------------+
extern int       MaxOrdersBUY  = 1; 
extern int       MaxOrdersSELL = 1; 

extern int       Magic1 = 1; 
extern int       Magic2 = 2; 
//+------------------------------------------------------------------+ 
int start() 
  {  
    int cnt_b_mg1 = CountOrder(OP_BUY,Magic1);
    int cnt_s_mg1 = CountOrder(OP_SELL,Magic1);
    
    int cnt_b_mg2 = CountOrder(OP_BUY,Magic2);
    int cnt_s_mg2 = CountOrder(OP_SELL,Magic2);
    
    if(A>B && cnt_b_mg1<MaxOrdersBUY) 
     { 
       OrderSend(Symbol(),OP_SELL,..Magic1.); 
     } 
    if(A<B && cnt_s_mg1<MaxOrdersSELL) 
     {  
       OrderSend(Symbol(),OP_BUY,..Magic1.); 
     } 
//---
    if(A>B && cnt_b_mg2<MaxOrdersBUY) 
     { 
       OrderSend(Symbol(),OP_SELL,..Magic2.); 
     } 
    if(A<B && cnt_s_mg2<MaxOrdersSELL) 
     {  
       OrderSend(Symbol(),OP_BUY,..Magic2.); 
     }
  //***************
  }
//+------------------------------------------------------------------+
//| Count Order Type                                                 |
//+------------------------------------------------------------------+
int CountOrder(int type, int mag)
  {
    int i,cnt = 0;
    
    for(i=0; i<OrdersTotal(); i++)
     {    
       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
          if(OrderSymbol()==Symbol() && OrderMagicNumber()==mag)
           {
             if(OrderType()==type)  cnt++;
           }
        }     
     }
    return(cnt);
  }
//+------------------------------------------------------------------+
 

Milord

Местный знаток
На основе ранее представленного кода:
надеюсь, смысл понятен, а все остальное зависит от составления условия...

не совсем понятен смысл считать сколько BUY и SELL ордеров:please:, если я написал - что это не важно в данном случае,важна лишь сортировка по магику, а точнее чтобы разделить по 2м магикам число открытых позиций..
ну лан,может сам додумаюсь относительно деталей или кто еще ответит..;)
 
Последнее редактирование:

mobidik

-----
не совсем понятен смысл считать сколько BUY и SELL ордеров:please:, если я написал - что это не важно в данном случае,важна лишь сортировка по магику, а точнее чтобы разделить по 2м магикам число открытых позиций..
ну лан,может сам додумаюсь относительно деталей или кто еще ответит..;)

Если Вам не нужно знать сколько именно ордеров на бай и селл в отдельности есть в рынке, а только их общие количество - тогда:
1) просуммировать полученные значения:
PHP:
cnt_mg1 = cnt_b_mg1+cnt_s_mg1;
2) Изменить саму ф-цию подсчета:
PHP:
//+------------------------------------------------------------------+
//| Count Order                                                      |
//+------------------------------------------------------------------+
int CountOrder(int mag)
  {
    int i,cnt = 0;
    
    for(i=0; i<OrdersTotal(); i++)
     {    
       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
          if(OrderSymbol()==Symbol() && OrderMagicNumber()==mag)
           {
             if(OrderType()<=1)  cnt++;
           }
        }     
     }
    return(cnt);
  }
//+------------------------------------------------------------------+
тогда вызывать её нужно так:
PHP:
int cnt_mg1 = CountOrder(Magic1);
int cnt_mg2 = CountOrder(Magic2);
 

vladradon

Программист
суть такая, нужно разделить по магику ордера, чтобы максимальное число открытых ордеров в каждом магике было своё,без разницы какой тип открытого ордера,ниже примерный кусок кода,куда нужно втиснуть нужный код
Ну, у меня все то же самое:
PHP:
extern int       Magic1=1;
extern int       Magic2=2;
extern int       MaxOrdersMagic1=1; 
extern int       MaxOrdersMagic2=1;
--------------------------------------------- 
int start() 
{ 
//------------------------------- 
double OrdersMagic1=0, OrdersMagic2=0;
for(int i=0;i<OrdersTotal();i++)
  if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES && OrderSymbol()==_Symbol))
    {
     if(OrderMagicNumber()==Magic1) OrdersMagic1++;
     if(OrderMagicNumber()==Magic2) OrdersMagic2++;
    }
//------ 
 if(A>B && OrdersMagic1<MaxOrdersMagic1) 
   { 
   OrderSend(Symbol(),OP_BUY,...,Magic1,...); 
   }   
 if(A<B && OrdersMagic1<MaxOrdersMagic1) 
   { 
   OrderSend(Symbol(),OP_SELL,...,Magic1,...); 
   } 
//--------------------------------------------------- 
 if(C>D && OrdersMagic2<MaxOrdersMagic2) 
   { 
   OrderSend(Symbol(),OP_BUY,...,Magic2,...); 
   }   
 if(C<D && OrdersMagic2<MaxOrdersMagic2) 
   { 
   OrderSend(Symbol(),OP_SELL,...,Magic2,...); 
   } 
//------ 
}
 

vladradon

Программист
суть такая, нужно разделить по магику ордера, чтобы максимальное число открытых ордеров в каждом магике было своё,без разницы какой тип открытого ордера,ниже примерный кусок кода,куда нужно втиснуть нужный код
Ну, у меня все то же самое:
PHP:
extern int       Magic1=1;
extern int       Magic2=2;
extern int       MaxOrdersMagic1=1; 
extern int       MaxOrdersMagic2=1;
--------------------------------------------- 
int start() 
{ 
//------------------------------- 
double OrdersMagic1=0, OrdersMagic2=0;
for(int i=0;i<OrdersTotal();i++)
  if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES && OrderSymbol()==_Symbol) && OrderType()<=1)
    {
     if(OrderMagicNumber()==Magic1) OrdersMagic1++;
     if(OrderMagicNumber()==Magic2) OrdersMagic2++;
    }
//------ 
 if(A>B && OrdersMagic1<MaxOrdersMagic1) 
   { 
   OrderSend(Symbol(),OP_BUY,...,Magic1,...); 
   }   
 if(A<B && OrdersMagic1<MaxOrdersMagic1) 
   { 
   OrderSend(Symbol(),OP_SELL,...,Magic1,...); 
   } 
//--------------------------------------------------- 
 if(C>D && OrdersMagic2<MaxOrdersMagic2) 
   { 
   OrderSend(Symbol(),OP_BUY,...,Magic2,...); 
   }   
 if(C<D && OrdersMagic2<MaxOrdersMagic2) 
   { 
   OrderSend(Symbol(),OP_SELL,...,Magic2,...); 
   } 
//------ 
}
 
Последнее редактирование:

Milord

Местный знаток
Ну, у меня все то же самое:
PHP:
extern int       Magic1=1;
extern int       Magic2=2;
extern int       MaxOrdersMagic1=1; 
extern int       MaxOrdersMagic2=1;
--------------------------------------------- 
int start() 
{ 
//------------------------------- 
double OrdersMagic1=0, OrdersMagic2=0;
for(int i=0;i<OrdersTotal();i++)
  if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES && OrderSymbol()==_Symbol) && OrderType()<=1)
    {
     if(OrderMagicNumber()==Magic1) OrdersMagic1++;
     if(OrderMagicNumber()==Magic2) OrdersMagic2++;
    }
//------ 
 if(A>B && OrdersMagic1<MaxOrdersMagic1) 
   { 
   OrderSend(Symbol(),OP_BUY,...,Magic1,...); 
   }   
 if(A<B && OrdersMagic1<MaxOrdersMagic1) 
   { 
   OrderSend(Symbol(),OP_SELL,...,Magic1,...); 
   } 
//--------------------------------------------------- 
 if(C>D && OrdersMagic2<MaxOrdersMagic2) 
   { 
   OrderSend(Symbol(),OP_BUY,...,Magic2,...); 
   }   
 if(C<D && OrdersMagic2<MaxOrdersMagic2) 
   { 
   OrderSend(Symbol(),OP_SELL,...,Magic2,...); 
   } 
//------ 
}
спасибо за помощь вам и выше товарищу!
хотел уточнить некоторые детали в ващем коде,например вот в этой строке
PHP:
 if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES && OrderSymbol()==_Symbol) && OrderType()<=1)
особенно непонятно
PHP:
_Symbol
можете пояснить что это за переменная и почему перед ней знак подчеркивания?
еще вопрос - если мне не важно(в данном случае) какой символ и какой тип ордера, важен только магик и количество открытых позиций по каждому магику, то мне кажется строка должна иметь вид
PHP:
 if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES)
я прав?;)
и будет ли логика работы правильной, если в итоге написать вот так:
PHP:
extern int       Magic1=1;
extern int       Magic2=2;
extern int       MaxOrdersMagic1=1; 
extern int       MaxOrdersMagic2=1;
--------------------------------------------- 
int start() 
{ 
//------------------------------- 
double OrdersMagic1=0, OrdersMagic2=0;
for(int i=0;i<OrdersTotal();i++)
  if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES)
    {
     if(OrderMagicNumber()==Magic1) OrdersMagic1++;
     if(OrderMagicNumber()==Magic2) OrdersMagic2++;
    }
//------
if(OrdersMagic1<MaxOrdersMagic1)
{
 if(A>B) 
   { 
   OrderSend(Symbol(),OP_BUY,...,Magic1,...); 
   }   
 if(A<B) 
   { 
   OrderSend(Symbol(),OP_SELL,...,Magic1,...); 
   } 
}
//--------------------------------------------------- 
if(OrdersMagic1<MaxOrdersMagic1)
{
 if(C>D) 
   { 
   OrderSend(Symbol(),OP_BUY,...,Magic2,...); 
   }   
 if(C<D) 
   { 
   OrderSend(Symbol(),OP_SELL,...,Magic2,...); 
   } 
}
//------ 
}
 
Последнее редактирование:
Верх