Уроки по программированию на языке MQL4 от eevviill

  • Автор темы Автор темы eevviill
  • Дата начала Дата начала

Milord

Местный знаток
Привет eevviill)
у меня вопрос такой, как написать в коде логику открытия ордеров в моем случае, чтобы ордера открывались по началу сигнала(условие A>B),смотрите ниже рисунок и кусок кода,в другой ветке ответили, но там по барам открытие, то есть в моем случае ордера откроются на новых барах если A>B, а мне то нужно открыть только 1 ордер при начале сигнала и все...

PHP:
extern int MaxOrders=5;

int start()
{
 if(OrdersTotal() < MaxOrders)
  {
//---------------------

   if(A>B)
    {
     OrderSend(....);
    }

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

Вложения

  • forex01.JPG
    forex01.JPG
    10 КБ · Просмотры: 23

eevviill

Заблокирован
Привет eevviill)
у меня вопрос такой, как написать в коде логику открытия ордеров в моем случае, чтобы ордера открывались по началу сигнала(условие A>B),смотрите ниже рисунок и кусок кода,в другой ветке ответили, но там по барам открытие, то есть в моем случае ордера откроются на новых барах если A>B, а мне то нужно открыть только 1 ордер при начале сигнала и все...

PHP:
extern int MaxOrders=5;

int start()
{
 if(OrdersTotal() < MaxOrders)
  {
//---------------------

   if(A>B)
    {
     OrderSend(....);
    }

//---------------------
  }
return(0);
}
Смотря какое условие.
 

Milord

Местный знаток
http://forexsystemsru.com/yazyk-programmirovaniya-mql4/67073-uroki-po-programmirovaniyu-na-yazyke-mql4-ot-eevviill-3.html#post413248
Василий, по вашей ссылке неясно где и что смотреть, там целая страница ответов и коментов....
мне было бы понятнее, если бы показал на моем куске кода,...

PHP:
extern int MaxOrders=5;

int start()
{
 if(OrdersTotal() < MaxOrders)
  {
//---------------------

   if(MA1>MA2)
    {
     OrderSend(....);
    }

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

borobor

Элитный участник
Василий, по вашей ссылке неясно где и что смотреть, там целая страница ответов и коментов....
мне было бы понятнее, если бы показал на моем куске кода,...

PHP:
extern int MaxOrders=5;

int start()
{
 if(OrdersTotal() < MaxOrders)
  {
//---------------------

   if(MA1>MA2)
    {
     OrderSend(....);
    }

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

выбери что-нибудь

Истина, если a равно b a == b;
Истина, если a не равно b a != b;
Истина, если a меньше b a < b;
Истина, если a больше b a > b;
Истина, если a меньше или равно b a <= b;
Истина, если a больше или равно b a >= b;
 

Milord

Местный знаток
выбери что-нибудь

Истина, если a равно b a == b;
Истина, если a не равно b a != b;
Истина, если a меньше b a < b;
Истина, если a больше b a > b;
Истина, если a меньше или равно b a <= b;
Истина, если a больше или равно b a >= b;

Уважаемый боробор, у вас опыт большой в написании, но вы меня не поняли, точнее мой вопрос, условие давно выбрано if(MA1>MA2)
напишите если не трудно в самом коде, чтобы было ясно вашу мысль?
 

Milord

Местный знаток
Здравствуйте Василий!
взял с вашего советника функцию трала, но он почему то не работает, задал вопрос в другую ветку форума, но там что то неясное ответили, а может я не понял, можете глянуть сами где тут ошибка???
PHP:
//-----------------------------------------------------------------
void Tral()
{
  for(int i=0; i<OrdersTotal(); i++) { 
    if(!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue; 
    if(OrderSymbol() != Symbol()) continue;        

    if(OrderType()==OP_BUY) { 
      if(Bid-OrderOpenPrice()>TrailingStop*Point&&Bid>=OrderOpenPrice()+TrailingStart*Point) { 
        if(OrderStopLoss()<Bid-(TrailingStop+TrailingStep-1)*Point) 
          OrderModify(OrderTicket(), OrderOpenPrice(),Bid-TrailingStop*Point, OrderTakeProfit(), 0, CLR_NONE); 
      } 
    } 

   if(OrderType()==OP_SELL) { 
     if(OrderOpenPrice()-Ask>TrailingStop*Point&& Ask<=OrderOpenPrice()-TrailingStart*Point) { 
        if(OrderStopLoss()>Ask+(TrailingStop+TrailingStep-1)*Point) 
         OrderModify(OrderTicket(), OrderOpenPrice(),Ask+TrailingStop*Point, OrderTakeProfit(), 0, CLR_NONE); 
      }
    } 
  } 
  
}
//------------------------------------------------
 

eevviill

Заблокирован
Здравствуйте Василий!
взял с вашего советника функцию трала, но он почему то не работает, задал вопрос в другую ветку форума, но там что то неясное ответили, а может я не понял, можете глянуть сами где тут ошибка???
PHP:
//-----------------------------------------------------------------
void Tral()
{
  for(int i=0; i<OrdersTotal(); i++) { 
    if(!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue; 
    if(OrderSymbol() != Symbol()) continue;        

    if(OrderType()==OP_BUY) { 
      if(Bid-OrderOpenPrice()>TrailingStop*Point&&Bid>=OrderOpenPrice()+TrailingStart*Point) { 
        if(OrderStopLoss()<Bid-(TrailingStop+TrailingStep-1)*Point) 
          OrderModify(OrderTicket(), OrderOpenPrice(),Bid-TrailingStop*Point, OrderTakeProfit(), 0, CLR_NONE); 
      } 
    } 

   if(OrderType()==OP_SELL) { 
     if(OrderOpenPrice()-Ask>TrailingStop*Point&& Ask<=OrderOpenPrice()-TrailingStart*Point) { 
        if(OrderStopLoss()>Ask+(TrailingStop+TrailingStep-1)*Point) 
         OrderModify(OrderTicket(), OrderOpenPrice(),Ask+TrailingStop*Point, OrderTakeProfit(), 0, CLR_NONE); 
      }
    } 
  } 
  
}
//------------------------------------------------
PHP:
///////////////////////////////////////////////////////////////////////////
void Traling_Stop_f()
{
  for(int i=0; i<OrdersTotal(); i++) 
  { 
    if(OrderSelect(i, SELECT_BY_POS))
    {
    if(OrderSymbol() == Symbol())
    {        
    if(OrderMagicNumber()==Magic)
    {

    if(OrderType()==OP_BUY) 
      { 
      if(Bid>=NormalizeDouble(OrderOpenPrice()+TrailingStart*point+TrailingStop*point,Digits)) 
      { 
        if(NormalizeDouble(OrderStopLoss(),Digits)<NormalizeDouble(Bid-(TrailingStop+TrailingStep)*point,Digits))
        {
        if(NormalizeDouble(OrderStopLoss(),Digits)!=NormalizeDouble(Bid-TrailingStop*point,Digits))
        {
        while(IsTradeContextBusy()) Sleep(int(pause_if_busy*1000));
        RefreshRates();
          if(OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TrailingStop*point,Digits), OrderTakeProfit(), 0, clrNONE))
          continue;
        } 
        }
      }
      } 

    if(OrderType()==OP_SELL) 
      { 
      if(Ask<=NormalizeDouble(OrderOpenPrice()-TrailingStart*point-TrailingStop*point,Digits)) 
      { 
        if((NormalizeDouble(OrderStopLoss(),Digits)>NormalizeDouble(Ask+(TrailingStop+TrailingStep)*point,Digits)) || OrderStopLoss()==0) 
        {
        if(NormalizeDouble(OrderStopLoss(),Digits)!=NormalizeDouble(Ask+TrailingStop*point,Digits))
        {
        while(IsTradeContextBusy()) Sleep(int(pause_if_busy*1000));
        RefreshRates();
          if(OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+TrailingStop*point,Digits), OrderTakeProfit(), 0, clrNONE))
          continue;
        }
        }
      }
      } 
    }
    }
    } 
  }
  
}
 

Milord

Местный знаток
Здравствуйте Василий!
у меня возник вопрос как разделить по магику число открытых ордеров, если в советнике использовано две ТС, то есть на каждую ТС свой магик, то как сделать так, чтобы во внешних настройках задавать максимальное число открытых ордеров независимо в каждой ТС, ниже кусок кода как я его вижу, добавьте что и как нужно в него?
ЗАРАНЕЕ СПАСИБО!

PHP:
extern int MaxTrades1 = 10;
extern int MaxTrades2 = 10;
extern int magic1 = 111;
extern int magic2 = 333;


int start() 
{
//---------TC1------------------
if(A>B)
 {
 OrderSend(...);
 }

//----------TC2-----------------
if(C>D)
 {
 OrderSend(...);
 }
//-----
}
//-----------end-------------
 

matro3

Почетный гражданин
Вы сами написали нужный код. Осталось найти кол-во ордеров с м-номерами от 1 и от 2 ТС. И сравнивать их с нужным количеством разрешенных.
Странный вопрос. ))
Кол-во ордеров по м-номеру найти просто: перебираете все и отсеиваете по условиям.
 

Milord

Местный знаток
Вы сами написали нужный код. Осталось найти кол-во ордеров с м-номерами от 1 и от 2 ТС. И сравнивать их с нужным количеством разрешенных.
Странный вопрос. ))
Кол-во ордеров по м-номеру найти просто: перебираете все и отсеиваете по условиям.

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

matro3

Почетный гражданин
Код:
int i, k = OrdersTotal(), r = 0;

for(i = 0; i < k; i++)
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      if(OrderSymbol() == _Symbol)
         if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            if(OrderMagicNumber() == mn)
               r++;

Таким кодом подсчитываем ордера.
Вы же этим уже занимались. Потому мне и не понятно что тут непонятно ))
Сначала для одного mn, потом для другого.
Вот Вам и кол-во ордеров по каждому.
 

Milord

Местный знаток
Подскажите логику работы???

PHP:
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
if(OrderMagicNumber()== Magic)

Подскажите плиз - почему цикл начинается от OrderTotal()-1, ведь число ордеров открытых это OrderTotal(),и почему i>=0,по моему более верно будет писать i=0, и строка будет выглядеть так
for (int i=OrdersTotal(); i=0; i--)
или вот так
for (int i=OrdersTotal(); i=1; i--)
будет это верным или нет, и почему отсчет числа ордеров идет от 0, а не от 1?
в чем будет разница работы моего варианта и приведенного выше?
а также вот такого варианта работы:
for (int i=0;i<=OrdersTotal()-1;i++)
или вот такого
for (int i=1;i<=OrdersTotal();i++)

а то я чет запутался:facepalm:, либо сам путаюсь, либо у других ошибки в коде, поясните плиз понятнее разницу в кодах и логику работы???
 
Последнее редактирование:

Milord

Местный знаток
Почему тут вапще код другой???

Сегодня будем перебирать ордера
PHP:
 1)for(int i=OrdersTotal()+1; i>=0; i--)
 {
 2)OrderSelect(i,SELECT_BY_POS);
 {
 3)if(OrderMagicNumber()==magic)
 {
 4)if(OrderType()==OP_BUY...) OrderClose(OrderTicket(),Lot,Bid,slippage,Yellow); 
 }
 }
 }

тут уже в коде написано
for(int i=OrdersTotal()+1; i>=0; i--)
но почему +1, а в других местах пишите -1:facepalm:
 

Milord

Местный знаток
Если работаете на одном инструменте, то функцию можно немного упростить.

double PointsPerPip()
{
int ppp;
if (MarketInfo( Symbol(), MODE_DIGITS) == 4 ) { ppp = 1;}
else { ppp = 10; }
return (ppp);
}
:D

или еще проще, вот так:)

PHP:
double PointsPerPip()
{
 int ppp=1;
 if (MarketInfo( Symbol(), MODE_DIGITS) == 5 ) { ppp = 10;}
 return (ppp);
}
 
Последнее редактирование:

matro3

Почетный гражданин
Код:
int i, k = OrdersTotal();
   
   if(BreakevenStart > 0)
   {
      double stopLossGridBr;
      if(position.type == OP_BUY)
         if(Bid - position.price > BreakevenStart * _Point && position.sl == 0)
         {
            stopLossGridBr = NormalizeDouble(position.price + BreakevenProfit * _Point, Digits);
            for(i = 0; i < k; i++)
               if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                  if(OrderSymbol() == _Symbol)
                     if(OrderMagicNumber() == magicNumber)
                        if(OrderType() == OP_BUY)
                        {
                           if(OrderStopLoss() < stopLossGridBr || OrderStopLoss() == 0)
                              ModifyOrder(-1, stopLossGridBr, -1, clrNONE);
                        }
         }
      if(position.type == OP_SELL)
         if(position.price - Ask > BreakevenStart * _Point && position.sl == 0)
         {
            stopLossGridBr = NormalizeDouble(position.price - BreakevenProfit * _Point, Digits);
            for(i = 0; i < k; i++)
               if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                  if(OrderSymbol() == _Symbol)
                     if(OrderMagicNumber() == magicNumber)
                        if(OrderType() == OP_SELL)
                        {
                           if(OrderStopLoss() > stopLossGridBr || OrderStopLoss() == 0)
                              ModifyOrder(-1, stopLossGridBr, -1, clrNONE);
                        }
         }
   }
   
   if(TrailingStart > 0)
   {
      double stopLossGridTr;
      if(position.type == OP_BUY)
         if(Bid - position.price > TrailingStart * _Point)
            if((position.sl < Bid - (TrailingStop + TrailingStep - 1) * _Point) || position.sl == 0)
            {
               stopLossGridTr = NormalizeDouble(Bid - TrailingStop * _Point, Digits);
               for(i = 0; i < k; i++)
               if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                  if(OrderSymbol() == _Symbol)
                     if(OrderMagicNumber() == magicNumber)
                        if(OrderType() == OP_BUY)
                        {
                           if(OrderStopLoss() < stopLossGridTr || OrderStopLoss() == 0)
                              ModifyOrder(-1, stopLossGridTr, -1, clrNONE);
                        }
            }
      if(position.type == OP_SELL)
         if(position.price - Ask > TrailingStart * _Point)
            if((position.sl > Ask + (TrailingStop + TrailingStep - 1) * _Point) || position.sl == 0)
            {
               stopLossGridTr = NormalizeDouble(Ask + TrailingStop * _Point, Digits);
               for(i = 0; i < k; i++)
               if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                  if(OrderSymbol() == _Symbol)
                     if(OrderMagicNumber() == magicNumber)
                        if(OrderType() == OP_SELL)
                        {
                           if(OrderStopLoss() > stopLossGridTr || OrderStopLoss() == 0)
                              ModifyOrder(-1, stopLossGridTr, -1, clrNONE);
                        }
            }
Вместо модификации запомни в переменную.
 

Fractlr

Новичок форума
Buenos dias:
Podria por favor explicarme como programar un "Reverse Trade"; es decir si BUY-->SELL y al reves?
Gracias
 

bot14

┳━┳
Господа знатоки, подскажите наверняка для вас простую вещь )))
Каким образом можно заменить символ, отображаемый индюком из Windings на похожий из Windings3, к примеру ? Есть общее решение ?
 

ron2009

Активный участник
Какой пароль на видеокурс,

Для лучшего понимания скачайте видеокурс по программированию
_http://file.karelia.ru/zrz98j/

Неподскажите какой пароль на архив этого видеокурса. Я скачал а разархировать не могу. Пароль просит. :disappointed:
 
Верх