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

 
Fox_RM:
Добрый день!
Сталкнулся с проблемой открытия определенного (заданного пользователем) количества ордеров.
Написал небольшой код который эту проблему должен решить и вроде решает, но бывают моменты
когда открывается произвольное количество ордеров, как правило ближе к концу теста.

Ниже сам код.

Если есть более простые варианты решения проблемы, буду рад комментариям.


Наверное так лучше

extern string Kolichestvo_orderov = "Количество единовременно открытых ордеров";
extern int OrederBuy = 1;
extern int OrederSell = 1;


int OrdS,OrdB,ticketBuy,ticketSell,lastticketSell=0,lastticketBuy=0;
//========================================================================================================//
                                //Подсчет количества ордеров BUY & SELL//
//========================================================================================================//
    for(int i = OrdersTotal()-1; i>=0; i--)
       {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
        if(OrderType()==OP_BUY)
            {
            OrdB++
            }
        if(OrderType()==OP_SELL)
            {
            OrdS++
            }
          }
       }   
//========================================================================================================//     
                                  //---- Открытие ордеров SELL ----//
//========================================================================================================//

  if(OrdS<=OrederSell)
    { //----- start 
    if(trendDn==true && SthFast>88.2 && SthSlow<38.2)
       {
      ticketSell=OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0,0,magick,0,Blue); //--- Если ордер открыт параметр OrdS увеличиваю 
       }
     } //-----end
          
//========================================================================================================//  
                                   //----Открытие ордеров BUY ----//
//========================================================================================================//  

   if(OrdB<=OrederBuy)
     { //-----start
     if(trendUp==true && SthFast<11.8 && SthSlow>61.8)
        {
        ticketBuy=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,0,magick,0,Red); //--- Если ордер открыт параметр OrdB увеличиваю
        }
      } //------end
//========================================================================================================//  
 
Lians:
Спасибо, но для меня сложновато, и Ваша функция выводит сразу 4 сообщения, а мне надо одно. Получается не более 64-х символов в одной строке?

Нет. Берёте своё длинное сообщение и делите его на столько частей, сколько удобно для восприятия на экране, но не более четырёх. Главное, чтобы каждая часть не превышала 64 символа. Если сообщение короткое, то его можно и одной частью передать в функцию.

Посмотрите, я в прицепе пристегнул советничек для проверки этой функции. Запустите его в тестере в визуальном режимеи на график визуализации накиньте индикатор Win_Inform (он в прошлом моём сообщении в прицепе). Сразу увидите работу этой функции.

Файлы:
 
r772ra:


Наверное так лучше

Я примерно с такого кода начинал свой модернизировать. В Вашем варианте 3 проблемы возникают:

- как только будут открыты ордера типа OP_BUY и OP_SELL то на каждом тике автоматически будут увеличиваться параметры OrdB и OrdS, поэтому я добавил условие пересчета только на изменении соответствующего тикета (селл или бай);

- пересчет всех ордеров приводит к погрешности OrdB и Ord, нам нужно только последние изменения в ордерах считать;

- в Вашем варианте отсутствует уменьшение параметров OrdB и Ord для дальнейшего открытия ордеров if(OrdB<=OrederBuy), if(OrdS<=OrederSell).

Вроде как-то так.

 
Fox_RM:

Я примерно с такого кода начинал свой модернизировать. В Вашем варианте 3 проблемы возникают:

- как только будут открыты ордера типа OP_BUY и OP_SELL то на каждом тике автоматически будут увеличиваться параметры OrdB и OrdS, поэтому я добавил условие пересчета только на изменении соответствующего тикета (селл или бай);

- пересчет всех ордеров приводит к погрешности OrdB и Ord, нам нужно только последние изменения в ордерах считать;

- в Вашем варианте отсутствует уменьшение параметров OrdB и Ord для дальнейшего открытия ордеров if(OrdB<=OrederBuy), if(OrdS<=OrederSell).

Вроде как-то так.

Да верно, надо перед циклом for, обнулить счётчики ордеров

//========================================================================================================//
                                //Подсчет количества ордеров BUY & SELL//
//========================================================================================================//
     OrdS=0;
     OrdB=0;
    
    for(int i = OrdersTotal()-1; i>=0; i--)
       {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
        if(OrderType()==OP_BUY)
            {
            OrdB++
            }
        if(OrderType()==OP_SELL)
            {
            OrdS++
            }
          }
       }   


 

Добрый день! Помогите пожалуйста разобраться с функцией от Кима:

 
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);
}

Мне не понятна строка

if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;

почему после первого if нет никаих знаков, что происходит, если выражение записано таким образом. Для чего выполняется действие StringFind, и почему поиск строки выполняется именно по JPY? Как может d = 0, и в каком случае присваивается 2, а в каком 4? Буду очень признательна за ответ, заранее спасибо)))

 
r772ra:

Да верно, надо перед циклом for, обнулить счётчики ордеров

)) Я почему-то сам об этом не подумал, начал накручивать.
 
Fox_RM:
)) Я почему-то сам об этом не подумал, начал накручивать.

В добрый путь
 
Lisi4ka330:почему после первого if нет никаих знаков, что происходит, если выражение записано таким образом. ... Как может d = 0, и в каком случае присваивается 2, а в каком 4? Буду очень признательна за ответ, заранее спасибо)))

так думаю будет понятнее

if (d==0)
{ 
  if (StringFind(sy, "JPY")<0)
  {
    d=4;
  } 
  else
  {
    d=2;
  }
}

d - точность котировки (цифры после запятой)

если в паре JPY то курс c мажорами примерно такого формата xxx.xx

если в паре отсутствует JPY то курсы мажоров примерно таковы x.xxxx (отсюда и название "четырёхзнак")

 
r772ra:

Да верно, надо перед циклом for, обнулить счётчики ордеров


Упустил из виду еще момент:

- в Вашем варианте отсутствует уменьшение параметров OrdB и OrdS для дальнейшего открытия ордеров if(OrdB<=OrederBuy), if(OrdS<=OrederSell).

В новом варианте получается открыли к примеру 5 ордеров, пересчитали, а дальше условие if не позволит открыть новые ордера. У меня в старом варианте OrdB-- и OrdS--

были использованы.

 
GaryKa:

так думаю будет понятнее

d - точность котировки (цифры после запятой)

если в паре JPY то курс c мажорами примерно такого формата xxx.xx

если в паре отсутствует JPY то курсы мажоров примерно таковы x.xxxx (отсюда и название "четырёхзнак")

GaryKa, спасибо за ответ, немного осталось непонятным, как d может быть равно 0, ведь функция
 d=MarketInfo(sy, MODE_DIGITS)
возвращает количество знаков после запятой, а значит d всегда будет больше 0 и условие всегда будет ложным
Причина обращения: