[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 113

 
r772ra:

Перебирайте позиции циклом

 

Спасибо огромное,сейчас буду все пробывать!Спасибо!
 
r772ra:

Перебирайте позиции циклом

 

Попробывал,не вышло. Так-то да получается его найти. Но проблема в том, что получается след. ситуация:

Например,01.01 я открыл сделку, но условие сработало только 02.01. Т.е. от цены открытия ордера в отрицательную сторону цена прошла 50п на второй день. Раз условие выполняется,действие будет выполнено. А действие заключается в уменьшении сделки на 1/3.Т.е. уменьшить объем сделки в три раза. Но действие будет работать пока не закроет лот полностью. Мы можем поставить какой-нибудь флаг. если b=0, то действие есть. А в конце действия b=1. Если в конце дня мы не обнулим флаг, то при тестировании по истории  сделка пройзойдет один раз и все. Если мы будем обнулять, то как только обнулится флаг, действие опять начнет уменьшать ордера,пока не закроет его полностью. Я думал можно было бы сравнивать объем изначально открывшейся сделки и затем измененный объем,но при сравнении они всегда будут одинаковы. Т.к. если мы уменьшим объем лота,уменьшится и объем средств на счете,следовательно и изначанльный объем снова пересчитается. Т.е. тоже не то,думаю уже 3-ий день. Никак не могу подобрать ключить.Подскажите пожалуйста, может у Вас есть какие-нибудь еще идеи?

 
Boneshapper:

Добрый день!

 Уважаемые профи, подскажите ,пожалуйста.

У меня по системе открывается ордер. Если цена превышает на 50п цену открытия этого ордера,то ордер надо модифицировать.

OrderSelect(0, SELECT_BY_POS,MODE_TRADES);   

double OPEN = OrderOpenPrice ();
double maximus = OPEN + 0.00500;
Alert ("maximus = ",maximus);
double minimus = OPEN - 0.00500;
RefreshRates();                                            //Обновляем данные.                                                
timecur = TimeToStr(TimeCurrent(),TIME_SECONDS);           //Вычисляем текущее время в формате HH:MM.
if ((timecur > "00:00:00") && (timecur < "22:58:00") && (Deal_s == 1) && (Deal_bb == 0)&& (Bid > maximus))
{
OrderSelect(0, SELECT_BY_POS,MODE_TRADES); 
Lootup = OrderLots () * 0.34;
Lootdown = OrderLots () * 0.34;
OrderClose(OrderTicket(), Lootdown, Ask, 10, CLR_NONE);
 Alert (GetLastError());
 Deal_bb = 1;
}

 Если это происходит в течение дня,то у меня получается это делать. А если это переносится на след.день,то все слетает.Т.к. в новый день может открыться еще один ордер,и он уже отслеживает по нему,а про старый забывает. Подскажите,пожалуйста, как прописать так,чтобы условие контролировало цену открытия+50 п именно по каждому из лотов,пока лот не закроется в течение нескольких дней?. 

Вы время загоняете в строку, а затем меряетесь строками - оригинально!!!
Не нужно ничего придумывать: сначала проверяете разрешение по времени, а затем просто трейлингуете ордера. Проверенные решения и того и другого найдёте здесь и здесь.

 
Boneshapper:

Попробывал,не вышло. Так-то да получается его найти. Но проблема в том, что получается след. ситуация:

Например,01.01 я открыл сделку, но условие сработало только 02.01. Т.е. от цены открытия ордера в отрицательную сторону цена прошла 50п на второй день. Раз условие выполняется,действие будет выполнено. А действие заключается в уменьшении сделки на 1/3.Т.е. уменьшить объем сделки в три раза. Но действие будет работать пока не закроет лот полностью. Мы можем поставить какой-нибудь флаг. если b=0, то действие есть. А в конце действия b=1. Если в конце дня мы не обнулим флаг, то при тестировании по истории  сделка пройзойдет один раз и все. Если мы будем обнулять, то как только обнулится флаг, действие опять начнет уменьшать ордера,пока не закроет его полностью. Я думал можно было бы сравнивать объем изначально открывшейся сделки и затем измененный объем,но при сравнении они всегда будут одинаковы. Т.к. если мы уменьшим объем лота,уменьшится и объем средств на счете,следовательно и изначанльный объем снова пересчитается. Т.е. тоже не то,думаю уже 3-ий день. Никак не могу подобрать ключить.Подскажите пожалуйста, может у Вас есть какие-нибудь еще идеи?

При чём тут дни вообще??? Вы вот напишите что хотите, а вам алгоритм подскажут. Сдаётся мне, что вам нужно не дни проверять, а профит/убыток ордера и от него плясать, раз для вас важны 50 (иль сколько там) пунктов...

 
TarasBY:

Вы время загоняете в строку, а затем меряетесь строками - оригинально!!!
Не нужно ничего придумывать: сначала проверяете разрешение по времени, а затем просто трейлингуете ордера. Проверенные решения и того и другого найдёте здесь и здесь.

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

Насчет косяков,простите, новичок,еще в  программировании не особо грамотный. 

 
artmedia70:

При чём тут дни вообще??? Вы вот напишите что хотите, а вам алгоритм подскажут. Сдаётся мне, что вам нужно не дни проверять, а профит/убыток ордера и от него плясать, раз для вас важны 50 (иль сколько там) пунктов...

Да, Вы правы. Именно от состояния профита/убытка отталкивался. TarasBY указал как раз на то,что нужно. Буду с этим сейчас разбираться.

Спасибо за уделённое внимание! 

 

Подскажите пожалуйста, вот есть функция кима по поиску фракталов

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.10.2006                                                     |
//|  Описание : Возвращает экстремум ЗигЗага по его номеру.                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (      0     - текущий ТФ)              |
//|    ne - номер экстремума           (      0     - последний)               |
//|    dp - ExtDepth                                                           |
//|    dv - ExtDeviation                                                       |
//|    bs - ExtBackstep                                                        |
//+----------------------------------------------------------------------------+
double GetExtremumZZPrice(string sy="", int tf=0, int ne=0, int dp=12, int dv=5, int bs=3) {
  if (sy=="" || sy=="0") sy=Symbol();
  double zz;
  int    i, k=iBars(sy, tf), ke=0;

  for (i=1; i<k; i++) {
    zz=iCustom(sy, tf, "ZigZag", dp, dv, bs, 0, i);
    if (zz!=0) {
      ke++;
      if (ke>ne) return(zz);
    }
  }
  Print("GetExtremumZZPrice(): Экстремум ЗигЗага номер ",ne," не найден");
  return(0);
}
Ка написать такую же функцию, которая сосчитает количество факталов за определенный период?
 
berezhnuy:

Подскажите пожалуйста, вот есть функция кима по поиску фракталов

Ка написать такую же функцию, которая сосчитает количество факталов за определенный период?

Как-то так:

void fGet_ExtremumsZZPrice (string fs_Symbol,           // инструмент
                            int fi_TF,                  // таймфрейм
                            datetime fdt_TimeControl,   // время, до которого ищем экстремумы
                            int fi_ExtDepth = 12,       // ExtDepth         
                            int fi_ExtDeviation = 5,    // ExtDeviation
                            int fi_ExtBackstep = 3)     // ExtBackstep
{
    double ld_Value, lda_Extremum[];
    int    li_size = iBarShift (fs_Symbol, fi_TF, fdt_TimeControl), li_IND = 0;
//---- 
    for (int li_Bar = 1; li_Bar < li_size; li_Bar++)
    {
        ld_Value = iCustom (fs_Symbol, fi_TF, "ZigZag", fi_ExtDepth, fi_ExtDeviation, fi_ExtBackstep, 0, li_Bar);
        if (ld_Value != 0.)
        {
            ArrayResize (lda_Extremum, li_IND + 1);
            lda_Extremum[li_IND] = ld_Value;
            li_IND++;
        }
    }
//---- 
}

Экстремумы ЗигЗага от текущего времени до Time_Control собраны в массив.

 
А подскажите пожалуйста функцию, чтоб проверить новый фрактал или старый?
 
berezhnuy:
А подскажите пожалуйста функцию, чтоб проверить новый фрактал или старый?

Вот, зашёл в тему "Полезные функции" и принёс Вам "на блюдечке с голубой каёмочкой:

//+----------------------------------------------------------------------------+
//| Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//| Версия   : 07.10.2006                                                      |
//| Описание : Поиск ближайшего фрактала.                                      |
//+----------------------------------------------------------------------------+
//| Параметры:                                                                 |
//|   sy - наименование инструмента     (NULL - текущий символ)                |
//|   tf - таймфрейм                    (  0  - текущий ТФ)                    |
//|   mode - тип фрактала               (MODE_LOWER|MODE_UPPER)                |
//+----------------------------------------------------------------------------+
double FindNearFractal(string sy="0", int tf=0, int mode=MODE_LOWER) {
  if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int d=MarketInfo(sy, MODE_DIGITS), s;
  if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;

  for (s=2; s<100; s++) {
    f=iFractals(sy, tf, mode, s);
    if (f!=0) return(NormalizeDouble(f, d));
  }
  Print("FindNearFractal(): Фрактал не найден");
  return(0);
}
Живи и пользуйся на здоровье! Их там каких только нет! Ни спрашивать не надо, ни ждать, а берёшь и пользуешься!
Причина обращения: