[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 970

 
Vinin:

Спасибо.
 
AlexSTAL:
предупреждений

Мой родной язык украинский. Но спасибо за внимание.
 

Help! Если, у меня выставлены 2-а отложенника и один из них закрылся по Take Profit-у нужно чтобы 2-й удалялся. Как это прописать? Где ошибка в коде?

int pos;
for (pos=0; pos<OrdersTotal(); pos++)
{
if (OrderSelect(pos, SELECT_BY_POS))
{
if (OrderClosePrice() >= OrderTakeProfit())
{
int i;
for (i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS))
{
if (OrderDelete(OrderTicket()))
{
Print("Ордер удален");
       }
      }
     }
    }
break;
   }
  }
 }
return(0);
}
 

Добрый вечер(в прошлых постах забыл поздороватся). Можете подсказать какой функцией воспользоватся чтобы сделать следуещее. В советнике идёт открытие ордера по индикатору на текущей свече(пусть будет номер=9). Если после открытия ордера он(индикатор) перерисовался(и после закрытия свечи9 не появился), то мне надо чтобы ПОСЛЕ закрытия свечи9 ордер закрылся.

 

Имеются входные параметры:

bool Mart  - если true, значит был закрытый ордер по стопу, следовательно делать удвоение.

TradeInf - разрешение торговли, если true, значит нет торгуемых ордеров и можно торговать)

Имеется следующий код:
if (Mart == true && TradeInf==true)
   {
   Alert("удвоение лота");
   LotS=NormalizeDouble(LotS*martin,2);
   Alert("размер лота",LotS);
   }
if (Mart == false && TradeInf==true)
   {
   Alert("Обнуление лота");
   LotS=lot;
   }

Далее в командах OpenOrder размер лота = LotS.

Так вот если он находит закрытый по лосу ордер то размер лота становится: -9315605757223323600
почему так? в чем ошибка? 

 

здравствуйте, высчитываю лот от значения баланса по разнообразному принципу...

в итоге получаю число вроде 0.2345, как мне обрубить double не округляя его, тоесть:

до одного знака - 0,2

до двух знаков - 0.23

до трех -  0,234 и тд...

 
akacuk21:

здравствуйте, высчитываю лот от значения баланса по разнообразному принципу...

в итоге получаю число вроде 0.2345, как мне обрубить double не округляя его, тоесть:

до одного знака - 0,2

до двух знаков - 0.23

до трех -  0,234 и тд...


double lot = NormalizeDouble(LOT,2)

lot- для выставление ордеров

LOT - формула расчета ордера

"2" - округление до 2-х знаков после запятой. 

 
спасибо за ответ, но в случае с NormalizeDouble число вида 0.29 при округлении до одного знака будет 0.3, а мне необходимо чтобы было 0.2
 
Это противоречит правилам округления, подождем тчо скажут старшие товарищи.
 
Sys15975382:
Это противоречит правилам округления, подождем тчо скажут старшие товарищи.

Э-э-э... Господа. Нельзя лоты нормализовать так просто... :) Вот вам в помощь:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.05.2008                                                     |
//|  Описание : Возвращает нормализованное значение торгуемого лота.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    lo - нормализуемое значение лота.                                       |
//|    ro - способ округления          (   False    - в меньшую,               |
//|                                        True     - в большую сторону)       |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//+----------------------------------------------------------------------------+
double NormalizeLot(double lo, bool ro=False, string sy="") {
  double l, k;
  if (sy=="" || sy=="0") sy=Symbol();
  double ls=MarketInfo(sy, MODE_LOTSTEP);
  double ml=MarketInfo(sy, MODE_MINLOT);
  double mx=MarketInfo(sy, MODE_MAXLOT);

  if (ml==0) ml=0.1;
  if (mx==0) mx=100;

  if (ls>0) k=1/ls; else k=1/ml;
  if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k;

  if (l<ml) l=ml;
  if (l>mx) l=mx;

  return(l);
}


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