Вопрос по пятому знаку

 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

int SleepOk = 2000;
int SleepErr = 6000;

int Buy(string symbol, double Lots, double price, double sl, double tp, int magic, string comment="") {
  RefreshRates();  
  int dig = MarketInfo(symbol, MODE_DIGITS);
  Lots=GetSizeLot();
  price = NormalizeDouble(price, dig);
  sl = NormalizeDouble(sl, dig);
  tp = NormalizeDouble(tp, dig);
    
  string _lot = DoubleToStr(Lots, 1);
  string _price = DoubleToStr(price, dig);
  string _sl = DoubleToStr(sl, dig);
  string _tp = DoubleToStr(tp, dig);

  Print("Buy \"", symbol, "\", ", _lot, ", ", _price, ", ", Slippage, ", ", _sl, ", ", _tp, ", ", magic, ", \"", comment, "\"");

  int res = OrderSend(symbol, OP_BUY,Lots, price, Slippage, sl, tp, comment, magic);
  if (res >= 0) {
    Sleep(SleepOk);
    return (res);
  } 
   
  int code = GetLastError();
  Print("Error opening BUY order: ", ErrorDescription(code), " (", code, ")");
  Sleep(SleepErr);

  return (-1);
}

int Sell(string symbol, double Lots, double price, double sl, double tp, int magic, string comment="") {
  RefreshRates();  
  int dig = MarketInfo(symbol, MODE_DIGITS);
Lots=GetSizeLot();
  price = NormalizeDouble(price, dig);
  sl = NormalizeDouble(sl, dig);
  tp = NormalizeDouble(tp, dig);
    
  string _lot = DoubleToStr(Lots, 1);
  string _price = DoubleToStr(price, dig);
  string _sl = DoubleToStr(sl, dig);
  string _tp = DoubleToStr(tp, dig);

  Print("Sell \"", symbol, "\", ", _lot, ", ", _price, ", ", Slippage, ", ", _sl, ", ", _tp, ", ", magic, ", \"", comment, "\"");
  
  int res = OrderSend(symbol, OP_SELL, Lots, price, Slippage, sl, tp, comment, magic);
  if (res >= 0) {
    Sleep(SleepOk);
    return (res);
  } 
   
  int code = GetLastError();
  Print("Error opening SELL order: ", ErrorDescription(code), " (", code, ")");
  Sleep(SleepErr);

  return (-1);
}

int SetBuyStop(string symbol, double lot, double price, double sl, double tp, int magic, string comment="", datetime exp = 0) {
  RefreshRates();  
  int dig = MarketInfo(symbol, MODE_DIGITS);

  price = NormalizeDouble(price, dig);
  sl = NormalizeDouble(sl, dig);
  tp = NormalizeDouble(tp, dig);
  
  string _lot = DoubleToStr(lot, 1);
  string _price = DoubleToStr(price, dig);
  string _sl = DoubleToStr(sl, dig);
  string _tp = DoubleToStr(tp, dig);

  Print("SetBuyStop \"", symbol, "\", ", _lot, ", ", _price, ", ", Slippage, ", ", _sl, ", ", _tp, ", ", magic, ", \"", comment, "\"");
  
  int res = OrderSend(symbol, OP_SELLLIMIT, lot, price, Slippage, sl, tp, comment, magic, exp);
  if (res >= 0) {
    Sleep(SleepOk);
    return (res);
  } 
   
  int code = GetLastError();
  Print("Error setting BUYSTOP order: ", ErrorDescription(code), " (", code, ")");
  Sleep(SleepErr);

  return (-1);
}

int SetSellStop(string symbol, double lot, double price, double sl, double tp, int magic, string comment="", datetime exp=0) {
  RefreshRates();  
  int dig = MarketInfo(symbol, MODE_DIGITS);

  price = NormalizeDouble(price, dig);
  sl = NormalizeDouble(sl, dig);
  tp = NormalizeDouble(tp, dig);
  
  string _lot = DoubleToStr(lot, 1);
  string _price = DoubleToStr(price, dig);
  string _sl = DoubleToStr(sl, dig);
  string _tp = DoubleToStr(tp, dig);

  Print("SetSellStop \"", symbol, "\", ", _lot, ", ", _price, ", ", Slippage, ", ", _sl, ", ", _tp, ", ", magic, ", \"", comment, "\"");
  
   int res = OrderSend(symbol, OP_BUYLIMIT, lot, price, Slippage, sl, tp, comment, magic, exp);
  if (res >= 0) {
    Sleep(SleepOk);
    return (res);
  } 
   
  int code = GetLastError();
  Print("Error setting SELLSTOP order: ", ErrorDescription(code), " (", code, ")");
  Sleep(SleepErr);

  return (-1);
}

bool CloseOrder(int ticket, double lot, double price) {

  RefreshRates();
  if (!OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) return(false);
  int dig = MarketInfo(OrderSymbol(), MODE_DIGITS);

  string _lot = DoubleToStr(lot, 1);
  string _price = DoubleToStr(price, dig);

  Print("CloseOrder ", ticket, ", ", _lot, ", ", _price, ", ", Slippage);
  
  bool res = OrderClose(ticket, lot, price, Slippage);
  if (res) {
    Sleep(SleepOk);
    return (res);
  } 
   
  int code = GetLastError();
  Print("CloseOrder failed: ", ErrorDescription(code), " (", code, ")");
  Sleep(SleepErr);

  return (false);
}

bool DeleteOrder(int ticket) {

  Print("DeleteOrder ", ticket);
  
  bool res = OrderDelete(ticket);
  if (res) {
    Sleep(SleepOk);
    return (res);
  } 
   
  int code = GetLastError();
  Print("DeleteOrder failed: ", ErrorDescription(code), " (", code, ")");
  Sleep(SleepErr);

  return (false);
}
 

Как всегда душераздирающий вопрос )))

Конечно же можно было решить вопрос по пятому знак просто умножив значения ейка,стопаи слипарджа на 10*

Вот кусок кода из советника

Как я понимаю тут именно нужно чтото изменить чтобы получить программное решение этого вопрса,то есть чтобы совтник сам понимал пятизначность котировки

Это вроде есть int dig = MarketInfo(symbol, MODE_DIGITS);

Но вероятно не достаточно ....

Пожалуйста введите корректировки в коде ....

 

Я делаю так

int MyDig

int init()

{

..

if(MarketInfo("EURUSD", MODE_DIGITS)==4)MyDig=1;else MyDig=10;

..

}

а потом уже в старте

OrderSend(....,price,slip*MyDig,stop*MyDig,take*MyDig.....)

 

либо так

extern int znak=4;

и в старт

OrderSend(....,NormalizeDouble(price,znak),slip,NormalizeDouble(stop,znak), и так далее)

 
faraon19785 писал(а) >>

Пожалуйста введите корректировки в коде ....

//+------------------------------------------------------------------------------------------------------------+
//|  Описание : Возвращает нормализованное под размер тика значение цены.                                      |
//+------------------------------------------------------------------------------------------------------------+
//|  Параметры:                                                                                                |
//|    np - нормализуемое значение цены.                                                                       |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)                                     |
//|    NormalizeDoubles - Колличество цифр после точки                                                         |
//+------------------------------------------------------------------------------------------------------------+
double DigitsPrice(double np = 0, string sy="", int NormalizeDoubles = -1){
  if (sy=="" || sy=="0") sy=Symbol();
  if (NormalizeDoubles == -1) NormalizeDoubles = MarketInfo(sy, MODE_DIGITS);
  int    di = MarketInfo(sy, MODE_DIGITS);

  if (di == 5 || di == 3){ np = np * 10; }
  if (di == 4 || di == 2){ np = np * 1; }
  
  np = NormalizeDouble(np,NormalizeDoubles);
  
  return(np);
}
Пример:
  int ticket;
  if(iRSI(NULL,0,14,PRICE_CLOSE,0)<25)
    {
     ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Bid-DigitsPrice(25)*Point,Ask+DigitsPrice(25)*Point,"My order #"+counter,16384,0,Green);
     if(ticket<0)
       {
        Print("OrderSend failed with error #",GetLastError());
        return(0);
       }
    }
Если на ДЦ 4-х значные котировки вернется 25, если 5-ти значные вернется 250. И так по всему коду для тейков, стопов, слипов, бидов, асков и т.д. Функция универсальна, можно вернуть необходимое колличество знаков после точки. Можно обращаться к другим валютным парам.
 

Решение применимо для сугубо частного случая с расхоже-бытовыми инструментами. Полно инструментов и с одним знаком, и без ваабче, и с тремя, и со стандартным тиком в 25 пунктов etc... Имо, нужно иметь спецификацию для каждого инструмента каждой кухни, в соответствии с которой и определяется дальнейшая логика поведения программы - приводить или нет.

 
Babay >>:

Решение применимо для сугубо частного случая с расхоже-бытовыми инструментами. Полно инструментов и с одним знаком, и без ваабче, и с тремя, и со стандартным тиком в 25 пунктов etc... Имо, нужно иметь спецификацию для каждого инструмента каждой кухни, в соответствии с которой и определяется дальнейшая логика поведения программы - приводить или нет.

А вот это верно!

особенно с выделеным намундрыкался одно время...

 

Я решаю этот вопрос при помощи нескольких функций, основная из них вот эта:


//Function MathPow10
int MathPow10(int Exponent)
{
//----------------------------------------------------------------------------//
int Result;
//----------------------------------------------------------------------------//
Result = MathPow(10,Exponent);
//----------------------------------------------------------------------------//
return(Result);
//----------------------------------------------------------------------------//
}


Дальше в зависимости от поставленной задачи, как пример приведу функцию перерасчета ширины канала в пункты (можно и размеры свечки ей пересчитать)


//Function ChannelSizeToInt
int ChannelSizeToInt(double ChannelSize, int SymbolDigits=4)
//Функция возвращает ширину канала в пунктах
{
//----------------------------------------------------------------------------//
double ChannelSizeDrobi;

int Factor,Factor2;
int Result;
//----------------------------------------------------------------------------//
  if(SymbolDigits<0){SymbolDigits=0;}
  if(SymbolDigits>5){SymbolDigits=4;}  

  if(SymbolDigits==0)
  {
  Result = ChannelSize;
  }
  else
  {
  Factor = MathPow10(SymbolDigits);
  Result = ChannelSize*Factor;
  }

ChannelSizeDrobi = MathAbs(ChannelSize-NormalizeDouble(ChannelSize,SymbolDigits-1));
Factor2 = MathPow10(SymbolDigits-1);

  if((SymbolDigits!=0)&&(ChannelSizeDrobi*Factor2>=0.5))
  {
  Result = Result+1;
  }
//----------------------------------------------------------------------------//
return(Result);
//----------------------------------------------------------------------------//
}
Причина обращения: