[Архив!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 2. - страница 56

 
Sergstuddek:


Класика это хорошо, но всерано есть проблемка)))

Теретически я то это понимаю но на практике не получается, может посмотрите на мой код и скажете что не так

Понимаю, что это простенький советник но я только начинаю свой путь))) и уже есть проблемка

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


Под термином стопы можно понимать 2 вещи - стоп-приказы (тейкпрофит и стоплосс) и стоповые отложки (Байстоп и Селлстоп). Что тут имеется ввиду под термином "стопы", понятно наверно только Вам. Пожалуйста, будьте точны в терминах. Компу нужно давать точные инструкции. Описание должно быть для этого тоже максимально точным
 
drknn:
Под термином стопы можно понимать 2 вещи - стоп-приказы (тейкпрофит и стоплосс) и стоповые отложки (Байстоп и Селлстоп). Что тут имеется ввиду под термином "стопы", понятно наверно только Вам. Пожалуйста, будьте точны в терминах. Компу нужно давать точные инструкции. Описание должно быть для этого тоже максимально точным

Прошу прощения за неточности под стоп-приказами имееться ввиду стоповые отложки (Байстоп и Селстоп)
 
Sergstuddek:

Прошу прощения за неточности под стоп-приказами имееться ввиду стоповые отложки (Байстоп и Селстоп)
void DeleteStopOrders()
{
  int res;
  for(int i=0;i<OrdersTotal();i++)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
    if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
    {
      if(OrderType()==OP_SELLSTOP)
        res=OrderDelete(OrderTicket());
      if(OrderType()==OP_BUYSTOP)
        res=OrderDelete(OrderTicket());
     }
  }
}


Эта функция написана не правильно. Ордера нужно перебирать от последнего к первому в списке ордеров. Ваш метод перебора приведёт к тому, что 1 ордер будет пропущен, так как после удаления список ордеров сдвигается по своим позициям. Цикл нужно организовывать так:

for (int i=OrdersTotal()-1;i>=0;i--){

Далее, если орден не выбран, не нужно делать брек - не нужно выходить из цикла - нужно узнать причину, почему ордер не выбран. То есть так:

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
  Print("При выборе ордера № ",i," произошла ошибка № ",GetLastError());

res=OrderDelete(OrderTicket()); - это тоже недостаточно правильно. Функция OrderDelete() имеет булевый тип. И помимо отдачи приказа на удаление ордера нужно обработать и ситуацию, если ордер удалить не получилось. То есть так:

res=OrderDelete(OrderTicket());
if(!res){
  Print("Ордер № ",OrderTicket()," удалить не получилось - ошибка № ",GetLastError());
}

Остальное гляну позже.

 
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
  if (CalculateCurrentOrders1(Symbol())==0)
   OpenBuy();
  if (CalculateCurrentOrders2(Symbol())<=1)
  DeleteStopOrders();
  if (CalculateCurrentOrders2(Symbol())<=1)
   OpenStops();
//----
   return(0);
}

Код функции старт написан не верно.

Первой функцией Вы складываете бай и селл ордера. Вам нужно подсчитывать отдельно бай и отдельно селл-ордера. Вот вчём дело. Если в рынке есть 1 бай-ордер, то нужно байстоп ставить с увеличенным лотом. Верно? А если в рынке селл-ордер, то байстоп нужно ставить с нормальным лотом, а селл-стоп с увеличенным. Как же Вы распознаете какой у Вас в рынке открыт ордер, если Вы суммируете Бай и Селл ордера в одной функции? Попробуйте переделать код в свете этих фактов.

 

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

 
_dude_:

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

Вадим Жунко о Вас позаботился. Скрипт подгрузки истории. В базе лежат еще несколько (раздел Скрипты).
 
gince:

Вопрос по индикатору.

Индикатор кросовый. Рисует много стрелок в одну сторону, потом много в другую. Как сделать, чтоб рисовались только первые. Пробовал так как вриведенном коде, но при переключений таим фрейма вце меняется.

Подскажите как это правильно сделать.


Надо бы посмотреть индикатор. Может и найдется решение
 
nemo811:
Помогите, пожалуйста, откорректировать советник. Необходимо сделать так, чтобы он работал с ордерами (своими и открытыми пользователем) той валютной пары, на графике которой установлен. Имеется в виду момент фиксирования прибыли или убытка. В текущей версии при наступлении условия (отлов % депозита) он пытается закрыть все позиции (с MAGIC=0) по всем парам, а это мне не надо. Необходимо полностью разграничить все валютные пары. Заранее благодарю.

А писать одно и тоже в разные ветки - это уже спам и можно бан получить
 
Vinin:

А писать одно и тоже в разные ветки - это уже спам и можно бан получить

Прошу прощение - как всегда хочется всё и сразу ))
 

Благодарю за внимание и понимание ))

Смог сам решить проблему:

всавил хитрую строчку if(OrderSymbol()!=SMB || OrderMagicNumber()!=MAGIC) continue;

в не менее хитрое место. После чего всё заработало, как и задумывалось.

Благодарю за подсказку с магиком. Я не программист, поэтому иной раз чего и недодумываю по незнанию.

Причина обращения: