Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 351

 
Помогите пожалуйста исправить ошибки в этой функции. Уже все соки из меня выжала. Суть функции, при достижении определенного профита функция должна закрыть половину ордера.
void CloseHalfOrder(){

for (int i = 0; i<=OrdersTotal(); i++)
{
if (OrderSelect (i,SELECT_BY_POS,MODE_TRADES) == true)
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderProfit()>= NormalizeDouble (TP*Point,Digits))
{
if (OrderType() == OP_BUY)
double Lots = OrderLots();
double HalfLot = NormalizeDouble (Lots*0.5,2);
OrderClose(OrderTicket(),HalfLot,Bid,0,HotPink);

if (OrderType() == OP_SELL)
double Lots1 = OrderLots();
double HalfLot1 = NormalizeDouble (Lots*0.5,2);
OrderClose(OrderTicket(),HalfLot1,Ask,0,HotPink);
}
}
}
}

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

void CloseHalfOrder(){

for (int i = 0; i<=OrdersTotal(); i++)
{
if (OrderSelect (i,SELECT_BY_POS,MODE_TRADES) == true)
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic){//Нефига тут профиту делать, это так, для убыстрения....

if(OrderProfit()>= NormalizeDouble (TP*Point,Digits)) //А тут вообще непонятки что с чем сравниваете....
{
if (OrderType() == OP_BUY)
double Lots = OrderLots();
double HalfLot = NormalizeDouble (Lots*0.5,2);// Тут озаботится чтобы лот не стал меньше минимального
OrderClose(OrderTicket(),HalfLot,Bid,0,HotPink);

if (OrderType() == OP_SELL)
double Lots1 = OrderLots();
double HalfLot1 = NormalizeDouble (Lots*0.5,2);
OrderClose(OrderTicket(),HalfLot1,Ask,0,HotPink);
}
}
}

}


}

да, и еще, а как сделать, чтобы она срабатывала только один раз за один открытый ордер?
 
TarasBY:
Принцип частичного закрытия ордеров можете посмотреть здесь.

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

 

еще раз.. Функция не работает. Хочу понять ошибки. + как сделать чтобы она срабатывала только 1 раз для 1 открытого ордера? Заранее огромное спасибо)

extern int TP         = 200; // это количество пунктов после которых должно произойти частичное закрытие
extern int Magic      = 77;


void CloseHalfOrder(){

for (int i = 0; i<=OrdersTotal(); i++)
  {
    if (OrderSelect (i,SELECT_BY_POS,MODE_TRADES) == true)
      {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderProfit()>= NormalizeDouble (TP*Point,Digits))
          {
            if (OrderType() == OP_BUY) 
            double Lots = OrderLots(); 
            double HalfLot  = NormalizeDouble (Lots*0.5,2); // изначально ( при открытии ордера) лот рассчитывается так, что он не может быть меньше чем 0,02
            OrderClose(OrderTicket(),HalfLot,Bid,0,HotPink);
          
            if (OrderType() == OP_SELL)
            double Lots1 = OrderLots(); 
            double HalfLot1  = NormalizeDouble (Lots*0.5,2);
            OrderClose(OrderTicket(),HalfLot1,Ask,0,HotPink);
          }
        }
      }
    }
 
Trader7777:

еще раз.. Функция не работает. Хочу понять ошибки. + как сделать чтобы она срабатывала только 1 раз для 1 открытого ордера?


Не очень понятное условие один раз для ордера. Ну тут наверное глобальные переменные использовать придётся. Может быть несколько ордеров, и по каждому только один раз?
 
Trader7777:

еще раз.. Функция не работает. Хочу понять ошибки. + как сделать чтобы она срабатывала только 1 раз для 1 открытого ордера?

Фильтр по размеру лота
 

У меня следующая ситуация. В советнике несколько модулей, каждый модуль занимает несколько пользовательских функций. Для того, чтобы не утонуть в коде, принял решение каждый модуль вынести в скрипты. Вот здесь приглянувшийся вариант вызова скрипта с эксперта. Но здесь возникает следующая проблема: при вызове скрипта надо передать ему некоторые параметры. Можно глобальными переменными. Какие ещё варианты можно придумать?

Сразу говорю: вариант "попроще" через iCustom() меня не устраивает по двум причинам. Во-первых, вызов модуля должен быть эпизодическим в памяти, а не постоянным. Во-вторых, индикаторными массивами я не пользуюсь.

 
Sepulca:

Не очень понятное условие один раз для ордера. Ну тут наверное глобальные переменные использовать придётся. Может быть несколько ордеров, и по каждому только один раз?

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

У меня следующая ситуация. В советнике несколько модулей, каждый модуль занимает несколько пользовательских функций. Для того, чтобы не утонуть в коде, принял решение каждый модуль вынести в скрипты. Вот здесь приглянувшийся вариант вызова скрипта с эксперта. Но здесь возникает следующая проблема: при вызове скрипта надо передать ему некоторые параметры. Можно глобальными переменными. Какие ещё варианты можно придумать?

Сразу говорю: вариант "попроще" через iCustom() меня не устраивает по двум причинам. Во-первых, вызов модуля должен быть эпизодическим в памяти, а не постоянным. Во-вторых, индикаторными массивами я не пользуюсь.


Библиотекой оформить как вариант.