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

sstyle

Активный участник
подскажите код расчета размера встречной позиции для перекрытия сетки ордеров по прибыли. Поясню: 10 ордеров с шагом 20 открыто в шорт. Есть какой-то убыток. Закрываем их, входим встречным ордером, ТП например 10пт. И надо перекрыть убыток. какая формула? Объемы позиций разные
 

Tonyr

Интересующийся
Добрый день.

как зациклить формулу. и что бы открывались по по очереди и по одному ордеру.
Заранее благодарен.


int start()
{
int total=OrdersTotal();
if(total<MaxOrders)
OrderSend(Symbol(),OP_BUY,Lot,Ask,slippage,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",MagicNumber ,0,CLR_NONE);
datetime t;
int i, k=OrdersTotal();
double r;
double L;
int mn=-1;
int type;
string sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (t<OrderOpenTime()) {
t=OrderOpenTime();
r=OrderOpenPrice();
type=OrderType();
L=OrderLots();
}
if(type == OP_BUY)
{
double Lots2;
Lots2=L+Lot2;
double Price;
Price = r-Shag*Point;
if(total<MaxOrders)
OrderSend (Symbol(),OP_SELLSTOP,Lots2,Price,slippage,Price+StopLoss*Point,Price-TakeProfit*Point,"",MagicNumber ,0,CLR_NONE); // Открываем в продажу
}
if(type == OP_SELL)
{
double Lots3;
Lots3=L+Lot2;
double Price3;
Price3 = r+Shag*Point;
if(total<MaxOrders+1)
OrderSend(Symbol(),OP_BUYSTOP,Lots3,Price3+Shag*Point,slippage,Price3-StopLoss*Point,Price3+TakeProfit*Point,"",MagicNumber ,0,CLR_NONE); // Открываем в покупку
}
}
}
}
}
 

matro3

Почетный гражданин
Почему так трудно написать код так, чтоб его было удобно читать?
У Вас в редакторе он так же выглядит? Без отступов и всего прочего?
 

Tonyr

Интересующийся
Написан он нормально. Я его вложил в сообщение.
Просто я практически не сижу в форумах.
Заранее благодарен за ответ.:please:
 

Вложения

  • 9992.mq4
    1,9 КБ · Просмотры: 34

temaxoma

Элитный участник
news_calendar_2exp_01

Помогите разобраться с новостником , похоже на сайте новостей поменяли кодировку в файле новостей и новостник перестал на графике отображать новости с файла , подскажите как определить кодировку файла на сайте и что изменить в функции f_Cyrilliс советника , что бы он начал правильно работать?
https://forexsystemsru.com/attachment.php?attachmentid=195752&d=1423647512
 

matro3

Почетный гражданин
Написан он нормально. Я его вложил в сообщение.
Просто я практически не сижу в форумах.
Заранее благодарен за ответ.:please:

Для начала вы тут. То что Вы не сидите на форумах не означает что кто-то будет читать то, что не читаемо.
Я копирую код, вставляю сюда и он с табуляторами. Почему у Вас они пропали не понятно.
И код написан плохо.
Вот так понятней:
Код:
int start()
{
   int total=OrdersTotal(); 
   if(total<MaxOrders) 
      OrderSend(Symbol(),OP_BUY,Lot,Ask,slippage,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",MagicNumber,0,CLR_NONE);
   datetime t; 
   int i, k=OrdersTotal(); 
   double r;
   double L;
   int mn=-1;
   int type;
   string sy=Symbol();
   for (i=0; i<k; i++)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn))
         {
            if (OrderType()==OP_BUY || OrderType()==OP_SELL)
            {
               if (t<OrderOpenTime())
               {
               t=OrderOpenTime();
               r=OrderOpenPrice();
               type=OrderType();
               L=OrderLots();
            }
            if(type == OP_BUY)
            { 
               double Lots2;
               Lots2=L+Lot2; 
               double Price;
               Price = r-Shag*Point;
               if(total<MaxOrders)
                  OrderSend (Symbol(),OP_SELLSTOP,Lots2,Price,slippage,Price+StopLoss*Point,Price-TakeProfit*Point,"",MagicNumber ,0,CLR_NONE);   //    Открываем в продажу
            }
            if(type == OP_SELL)
            {
               double Lots3;
               Lots3=L+Lot2; 
               double Price3;
               Price3 = r+Shag*Point; 
               if(total<MaxOrders+1)
                  OrderSend(Symbol(),OP_BUYSTOP,Lots3,Price3+Shag*Po    int,slippage,Price3-StopLoss*Point,Price3+TakeProfit*Point,"",MagicNum ber   ,0,CLR_NONE); // Открываем в покупку
            } 
         }
      }
   }
}
А делает он странные вещи.
Открывает ордер BUY на каждом тике, пока кол-во ордеров не достигнет MaxOrders. И на каждом тике выставляет отложку SELLSTOP.

int type = GetTypeLastOpenPos(_Symbol, MagicNumber);
if(type == OP_BUY)
{
// Открываем в продажу
}
if(type == OP_SELL)
{
// Открываем в покупку
}
Функцию GetTypeLastOpenPos напишите за пределами start. И лучше заменить start на void OnTick(). Чтоб не открывать бесконечное кол-во ордеров ограничте это каким-нибудь условием.
 

Tonyr

Интересующийся
Функцию GetTypeLastOpenPos напишите за пределами start. И лучше заменить start на void OnTick(). Чтоб не открывать бесконечное кол-во ордеров ограничьте это каким-нибудь условием.

Не пойму как ограничить открытие отложенных ордеров.

Поставил уже void OnTick() один фиг открывает огромное кол-во BUYSTOP.

Если можете, помогите пожалуйста.

HTML:
void OnTick()
    {
    int total=OrdersTotal(); 
    if (total<1)
    OrderSend(Symbol(),OP_BUY,Lot,Ask,slippage,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",MagicNumber ,0,CLR_NONE);
    else
    datetime t;  
    int i, k=OrdersTotal(); 
    double r;
    double L;
    int mn=-1;
    int type;
    int o;
    string sy=Symbol();
    for (i=0; i<k; i++) 
    {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
     {
       if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) 
       {
         if (OrderType()==OP_BUY || OrderType()==OP_SELL || type==OP_BUYSTOP || type==OP_SELLSTOP) 
         {
           if (t<OrderOpenTime()) 
           {
            t=OrderOpenTime();
            r=OrderOpenPrice();
            type=OrderType();
            L=OrderLots();
            o=OrdersTotal();
           }
        if(type == OP_BUY)
        {  
         double Lots2;
         Lots2=L+Lot2;  
         double Price;
         Price = r-Shag*Point;
         if (total<1)
         OrderSend (Symbol(),OP_SELLSTOP,Lots2,Price,slippage,Price+StopLoss*Point,Price-TakeProfit*Point,"",MagicNumber ,0,CLR_NONE);   // Открываем в продажу
        }  
        if(type == OP_SELL)
        {  
         double Lots3;
         Lots3=L+Lot2;  
         double Price3;
         Price3 = r+Shag*Point;
      
         OrderSend(Symbol(),OP_BUYSTOP,Lots3,Price3+Shag*Point,slippage,Price3-StopLoss*Point,Price3+TakeProfit*Point,"",MagicNumber ,0,CLR_NONE);  // Открываем в покупку
        }
        
                    
         }
       }
     } 
   } 
 
        return;
   }

Заранее благодарен.
 

ruslan970

Активный участник
:)Народ! Кто нибудь может проверить корректность вставки индюков в советник. И еще сказать по какому сигналу идет открытие ордеров. Если есть кто может ответить сову кину. Спасибо.
 

matro3

Почетный гражданин
Поставил уже void OnTick() один фиг открывает огромное кол-во BUYSTOP.
Это просто приведение к стандарту.
Само оно не ограничится...
Зачем на первом тике открывается ордер? Просто по умолчанию, безо всяких условий.
 

Tonyr

Интересующийся
Это просто приведение к стандарту.
Само оно не ограничится...
Зачем на первом тике открывается ордер? Просто по умолчанию, безо всяких условий.


Лучше помогите ограничить открытие отложенных ордеров.
Я уже и так и всяк, а толку нет.

PHP:
if(type == 0)
        {  
         double Lots2;
         Lots2=L+Lot2;  
         double Price;
         Price = r-Shag*Point;
         if (type != 5)
         {
         OrderSend (Symbol(),OP_SELLSTOP,Lots2,Price,slippage,Price+StopLoss*Point,Price-TakeProfit*Point,"",MagicNumber ,0,CLR_NONE);   // Открываем в продажу
         }
        }

То есть он открывает buy проверяет последний ордер открывает sellstop, и по идеи он при получении следующего тика на втором условии должен пройти дальше, а нет он опять открывает sellstop.]:->

Помогите прошу.
 

AlexeyVik

Программист mql4 mql5
Лучше помогите ограничить открытие отложенных ордеров.
Я уже и так и всяк, а толку нет.

PHP:
if(type == 0)
        {  
         double Lots2;
         Lots2=L+Lot2;  
         double Price;
         Price = r-Shag*Point;
         if (type != 5)
         {
         OrderSend (Symbol(),OP_SELLSTOP,Lots2,Price,slippage,Price+StopLoss*Point,Price-TakeProfit*Point,"",MagicNumber ,0,CLR_NONE);   // Открываем в продажу
         }
        }

То есть он открывает buy проверяет последний ордер открывает sellstop, и по идеи он при получении следующего тика на втором условии должен пройти дальше, а нет он опять открывает sellstop.]:->

Помогите прошу.
а вот это можешь объяснить как работает?
Код:
    int total=OrdersTotal();
      if (total<1)
     OrderSend(Symbol(),OP_BUY,Lot,Ask,slippage,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",MagicNumber ,0,CLR_NONE);
     else
    datetime t;
Следи за мыслью.
Если открытых ордеров меньше одного
откроем ордер Buy
иначе

Если ордер Buy при первом запуске открылся, то переменная datetime t; остаётся не объявленной и выполнение переходит на следующую строку и дальше... а там цикл. Пока ордеров 1 цикл выполняется один раз и ставится 1 отложенный ордер.
Функция завершена.

А вот на следующем тике чуток по-другому.
Открытых ордеров не меньше одного
переходим дальше
......
Опять начинается цикл. При открытых ордерах в количестве 2. Buy и SellStop.
Ставится ещё, слава Богу только 1 т.к. Buy всего один.
И ТАК ДАЛЕЕ...

Если тебе просто дать правильно написанный код пользы будет меньше. Научись думать над тем что делаешь. Что получится если сделать так...
 

viplert

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

Tonyr

Интересующийся
Доброе время суток.

Подскажите пожалуйста есть такая функция GetLastOrderOpenTime? Если есть то подскажите как ей пользоваться?
Или формула определяющая тип последнего открытого ордера?

А то уже голову сломал. Как его до ума довести хотя бы по 1-ой ступени.


PHP:
int start()
    {
    int total=OrdersTotal(); 
    if (total<1)
    OrderSend(Symbol(),OP_BUY,Lot,Ask,slippage,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",MagicNumber ,0,CLR_NONE);
    else
    {
    datetime t=0;  
    int i, k=OrdersTotal(); 
    double r;
    double L;
    int mn=-1;
    int type;
    string sy=Symbol();
    for (i=0; i<k; i++) 
    {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
     {
       if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) 
       {
         if (OrderType() == OP_SELL || OrderType() == OP_BUY || OrderType() == OP_SELLSTOP || OrderType() == OP_BUYSTOP) 
         {
           if (t<OrderOpenTime()) 
           {
            t=OrderOpenTime();
            r=OrderOpenPrice();
            type=OrderType();
            Alert ("Тип=",type);
            L=OrderLots();
            total=OrdersTotal();
            Alert ("Всего=",total);
            }
         if(OrdersTotal() == 1  || OrdersTotal() == 3    || OrdersTotal() == 5    || OrdersTotal() == 7    || OrdersTotal() == 9)  
        {
         if (type == 4 || type == 5)
         continue;
         else
         {  
         double Lots2;
         Lots2=L+Lot2;  
         double Price;
         Price = r-Shag*Point;
         if (type == 0)
         {
         OrderSend (Symbol(),OP_SELLSTOP,Lots2,Price,slippage,Price+StopLoss*Point,Price-TakeProfit*Point,"",MagicNumber ,0,CLR_NONE);   // Открываем в продажу
         }}
        }
        if(OrdersTotal() == 2 || OrdersTotal() == 4    || OrdersTotal() == 6    || OrdersTotal() == 8    || OrdersTotal() == 10)   
        {
        if (type == 4 || type == 5)
        continue;
        else
        {  
         double Lots3;
         Lots3=L+Lot2;  
         double Price3;
         Price3 = r+Shag*Point;
         if (type == 1)
         OrderSend(Symbol(),OP_BUYSTOP,Lots3,Price3,slippage,Price3-StopLoss*Point,Price3+TakeProfit*Point,"",MagicNumber ,0,CLR_NONE);  // Открываем в покупку
        }
         }                   
         }
       }
     } 
   }
   }
   return (t);
   }
:facepalm:
 

matro3

Почетный гражданин
Код:
// Открыта позиция и есть ордера
   if(position.exists && position.total_orders > 0)
   {
      //Print("Открылась поза - удаляем лишнюю отложку");
      if(position.type == ENTER_BUY)
      {
         DeleteOrders(_Symbol, OP_SELLSTOP, position.magic);
         DeleteOrders(_Symbol, OP_SELLLIMIT, position.magic);
      }
      if(position.type == ENTER_SELL)
      {
         DeleteOrders(_Symbol, OP_BUYSTOP, position.magic);
         DeleteOrders(_Symbol, OP_BUYLIMIT, position.magic);
      }
   }
 

sstyle

Активный участник
Написал функцию трейлинг стопа, но она просчитывается только один раз за свечу, а не постоянно. То есть пока цена идет по свече, стоп на месте. Как сделать чтобы обновлялся постоянно? Заранее благодарен
 

sstyle

Активный участник
Спасибо, но если я вставляю ее над функцией start() то сова вобще перестает работать. А если вместо старт то работает. Но нафига мне весь код каждый тик просчитывать, если только трал надо. как быть?
 

Ugar

Гуру форума
Спасибо, но если я вставляю ее над функцией start() то сова вобще перестает работать. А если вместо старт то работает. Но нафига мне весь код каждый тик просчитывать, если только трал надо. как быть?
OnTick() это и есть start() только по новому.
Вызов трала надо делать внутри start(), эта функция выполняется с приходом тика.
 
Верх