Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Торгуй как успешные трейдеры - подпишись на их сигналы!
MrSnaKe
94
MrSnaKe 2014.10.11 15:19 

привет всем

хочу сделать скрипт

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

Для разделения ордеров использую часовую метку

часть кода далее

datetime         time; 

  for (i = TotalOrder; i >= 0; i--)

   {

    if (OrderOpenTime() > time )

     {

      TP=TotalProfit();

      if (Profit < TP && xoBuy >= 1 && xoSell >= 10)

       { 

        CloseOrders();

       }

     }

   }



  if(xOpenOrders == xAllOrders)

   {

    time=TimeCurrent();

   }   



  for (i = TotalOrder; i >= 0; i--)

   {

    if (OrderOpenTime() < time )

     {

      TrailingStop();

     }

   } 

 

работает только тот кусок кода

 

datetime         time; 

  for (i = TotalOrder; i >= 0; i--)

   {

    if (OrderOpenTime() > time )

     {

      TP=TotalProfit();

      if (Profit < TP && xoBuy >= 1 && xoSell >= 10)

       { 

        CloseOrders();

       }

     }

   }

 а вот здесь почему то не работает никак немогу понять почему

 for (i = TotalOrder; i >= 0; i--)

   {

    if (OrderOpenTime() < time )

     {

      TrailingStop();

     }

   } 

 и еще одна проблема когда достигнут лимит ордеров то время изменяется на каждом тике а мне надо хранить время когда сделана последняя ставка как ето сделать? или есть другой пособ разделять ордера? 

 if(xOpenOrders == xAllOrders)

   {

    time=TimeCurrent();

   }   

 

 спасибо заранее

Vitalie Postolache
11597
Vitalie Postolache 2014.10.11 18:47  
Хто такой TotalOrder? Где инициализирован?

Ошибки из логов сюда опубликовать надо, код функции TrailingStop() тоже не мешало бы.

С временем - надо найти самый свежий ордер, присвоить его время статической переменной и больше её не трогать, до следующего ордера, не надо TimeCurrent() писать на каждом тике.

MrSnaKe
94
MrSnaKe 2014.10.11 19:29  

Ошибок нет так как ето только часть советника

но если ето поможет то TotalOrder

int TotalOrder = OrdersTotal();

TrailingStop()

void TrailingStop()
{
int i, TotalOrder = OrdersTotal();
bool res;

for (i = TotalOrder; i >= 0; i--)
 {
  if(OrderSelect(i, SELECT_BY_POS) && OrderType()==OP_BUY && OrderSymbol() == _Symbol && OrderMagicNumber() == magic)
   {
    if(OrderOpenPrice()+TrailingStop*Point < Bid)
     {
      if (OrderStopLoss() < Bid-StopLoss*Point)
       {
        res = OrderModify(OrderTicket(),OrderOpenPrice(),Bid-StopLoss*Point,OrderTakeProfit(),0,Blue);
       }
     }
   }
  if(OrderSelect(i, SELECT_BY_POS) && OrderType()==OP_SELL && OrderSymbol() == _Symbol && OrderMagicNumber() == magic)
   {
    if(OrderOpenPrice()-TrailingStop*Point > Ask)
     {
      if(OrderStopLoss() > Ask+StopLoss*Point)
       {
        res = OrderModify(OrderTicket(),OrderOpenPrice(),Ask+StopLoss*Point,OrderTakeProfit(),0,Blue);
       }
     }
   }
 }
}

 но проблема не здесь ето все у меня работает

 

проблема какая советник работает по своєму алгоритму и есть лимин например на 10 ордеров и как только он слетает 10 ордер я хочу чтоб он начал работать заново а на ети ордера с какими "пошло не по плану" он поставил трейлинг стоп. Все остальное у меня работает кроме момента где надо както различать ордера до лимита и после я нашел возможность различать по времени ордера но оно не работает возможно есть другой вариант? 

MrSnaKe
94
MrSnaKe 2014.10.11 19:38  

я считаю что проблема гдето здесь

 if (OrderOpenTime() < time )

 возможно  OrderOpenTime() надо конвертировать? а то такое впечетление что не работает здесь timetosrt или другая ф-ция или я ошибаюсь?

Vitalie Postolache
11597
Vitalie Postolache 2014.10.11 19:59  
for (i = TotalOrder-1; i >= 0; i--)
MrSnaKe
94
MrSnaKe 2014.10.11 20:03  
evillivefor (i = TotalOrder-1; i >= 0; i--)
ето к чему?
MrSnaKe
94
MrSnaKe 2014.10.11 20:18  

Мне кажется Вы не до конца понимаете что я хочу сделать

Идея какая например есть подозрение на тренд я запускаю советника и разрешаю ему сделать 10 ордеров, тренд пошел советник сделал свое дело ( открыл оредара, установил тейпрофит, стоплос и тд) и если ети ордера уже в плюсе то почему б не заработать еще и советник опять делает 10 ордеров, и после надо первые 10 ордеров тралить а 10 последних по основному алгоритму

и если я сделаю  for (i = TotalOrder-1; i >= 0; i--) то тралить он у меня буде 19 ордеров а не 10 как мне надо. Я вижу только одно решение разделять ордера по дате открытия.

Vitalie Postolache
11597
Vitalie Postolache 2014.10.11 20:34  
MrSnaKe:
ето к чему?

ето к тому, что в изначальном варианте цикла

for (i = TotalOrder; i >= 0; i--)

считается на одну итерацию больше, чем количество ордеров. Если ордеров 10, то цикл должен считать от 9 до 0 (то есть 10 всего), а тут считается от 10 до 0 - 11 итераций. Это неправильно.

MrSnaKe
94
MrSnaKe 2014.10.11 20:39  
evillive:

ето к тому, что в изначальном варианте цикла

считается на одну итерацию больше, чем количество ордеров. Если ордеров 10, то цикл должен считать от 9 до 0 (то есть 10 всего), а тут считается от 10 до 0 - 11 итераций. Это неправильно.

Спасибо сейчас поправлю

А с основной проблемою есть соображения? 

Vitalie Postolache
11597
Vitalie Postolache 2014.10.11 20:54  
Насколько я понял, если лимит 10 ордеров, то надо дождаться когда будет открыт 20-й ордер, найти самые старые 10 ордеров и тралить их, не трогая более новые 10 ордеров. Если так, то надо в отдельном цикле сортировку тикетов организовать по убыванию времени открытия, вбить в массив старые ордера и потом в тралинге выбирать ордера уже по тикету.
MrSnaKe
94
MrSnaKe 2014.10.11 21:17  

Несовсем советник работает на отложках, и когда срабатывает последняя отложка надо начать тралить 10 ордеров и опять открыть 10 отложек и так по кругу. Такой вариан не очень так как есть вероятность что может быть не 10 а 20 или больше ордеров 

Например я открываю 10 отложек с тейк профитом 200 пунктов каждие 5 пунтов итого когда цена пройдет 50 пунков все отложки сработают но до тейк профит а будет еще 150 пунктов и советник откроет еще 10 отложек и если не будет отката (цена пойдет далее по тренду и не сработает трейлинг стоп) то у меня будет 20 ордеров (10 первим до тей профита будет 100 пунктов, а 10 вторым 150 пунков) и советник опять откроет 10 отложек и надо будет вже 20 ордеров тралить а не 10

 как по мне лучше разделать ордера по времени - тралить все ордера до времени Х, а после времени Х работать по основному алгоритму.

а то если тренд пойдет на 1000 пунктов, а трейлинг стоп или даже не трейлинг стоп а выставлять ордера в безубыток + несколько пунктов заработка и ждать срабатывания тейк профита то на 1000 пунктов тренда соберется около 200 ордеров и повторюсь легче будет разделять по времени ( обновлять время когда будет новая пачка отложек) нежели делать масив на заранее неизвесное количество ордеров или я ошибаюсь?

/ /12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий