Переделать код под 5 цифр после запятой

 

Привет Всем,

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

Спасибо!

PS На всякий случай, вот линк на исходник: 'Калькулятор Forex'

//+------------------------------------------------------------------+
//| Calculator_Forex.mq4                                             |
//| Copyright © 2007, DRKNN                                          |
//| drknn@mail.ru                                                    |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, DRKNN"
#property link "drknn@mail.ru"

#property show_inputs
extern double Depozit=0.0;//каким количеством капитала будем рисковать (если ноль, то рассчёт идет для того депозита, который в терминале)
extern double Risk=3.0;//каким количеством капитала будем рисковать (в процентах)
extern string t11="------- Для рассчёта стоп-лосса по лоту --------";
extern double Lot=0.2;//с каким лотом будем открывать позицию.  
extern string t1="------- Для рассчёта лота по стоп-лоссу --------";
extern double StopLoss=15.0;

/*
формула рассчёта максимального стоп-лосса для указанного пользователем лота:
SL_PNT=normRisk*normDepozit/PointPrise/Lot;  
*/


//+------------------------------------------------------------------+
//| Начало работы скрипта                                            |
//+------------------------------------------------------------------+
int start()
{
string SMB=Symbol();
double normRisk=0;//содержит нормализованный риск
double SL_PNT=0;//стоп-лосс в пунктах
double MinLot=MarketInfo(SMB,MODE_MINLOT);//минимальный размер лота  
double MaxLot=MarketInfo(SMB,MODE_MAXLOT);//максимальный размер лота
double ryn_Lot=0;//рассчитываемый лот для указнааного пользователем стоп-лосса
double LotStep=MarketInfo(SMB,MODE_LOTSTEP);//шаг изменения лота
double normDepozit=0;
int TipInstrumenta=10000;
double PointPrise=0;
string SMB1,SMB2;
double BazCours=0;// курс базовой валюты по отношению к доллару
double ryn_PointPrise=0;//стоимость пункта при минимальном лоте
double ryn_SL=0;//стоп-лосс для минимального лота
int MinLevel=MarketInfo(SMB,MODE_STOPLEVEL);//Минимально допустимый уровень стоп-лосса (тейк-профита) в пунктах
string t1="=============================";






//------------------------------------------------------------------------------------------------------------------------
Alert (t1);
//-------- Защита от дурака ----------------------

if(Risk<=0){
Alert(" Ошибка! Risk должен быть больше нуля.");
return(0);
}
if(Lot Alert(" Ошибка! Lot не должен быть меньше ",MinLot);
return(0);
}
if(Lot>MaxLot){
Alert(" Ошибка! Lot не должен быть больше ",MaxLot);
return(0);
}

if(StopLoss Alert(" Ошибка! StopLoss не должен быть меньше ",MinLevel," пунктов");
return(0);
}
if(Lot>=MinLot && Risk!=0 && StopLoss>=MinLevel){

//------ нормализуем депозит ------------
if(Depozit==0){
normDepozit=AccountBalance();//Баланс счёта
}
if(Depozit>0){
normDepozit=Depozit;  
}
//------ нормализуем процент риска ------------
normRisk=Risk/100;
// ------- смотрим, Risk," процентов от депозита это сколько в центах -----------------
double normRiskPersent=NormalizeDouble(normDepozit*normRisk,2);

// --------- вычисляем какая пара (прямая, обратная, кросс) --------------
TipInstrumenta=StringFind( SMB,"USD",0);  

//------ извлекаем имя первой валютной пары ------------
SMB1=StringSubstr(SMB,0,3); //базовая валюта
//SMB2=StringSubstr(SMB,3,3);// валюта котирования.

// ------- текущая котировка базовой валюты к доллару США -------------
BazCours=MarketInfo(SMB1+"USD",MODE_BID);
//Alert("Tекущая котировка базовой валюты к доллару США = ",BazCours);



// --------- рассчитываем стоимость пункта -------------------------
if(TipInstrumenta==3){//пара прямая, напр. EurUsd
PointPrise=1000000*Lot/10*Point;
ryn_PointPrise=1000000*MinLot/10*Point;//стоимость пункта при минимальном лоте
}
if(TipInstrumenta==0){//пара обратная, напр. UsdJpy
PointPrise=1000000*Lot/10*Point/Bid;
ryn_PointPrise=1000000*MinLot/10*Point/Bid;//стоимость пункта при минимальном лоте
}
if(TipInstrumenta==-1){//Кросс-пара, напр EurJpy
PointPrise=1000000*Lot/10*Point*BazCours/Bid;
ryn_PointPrise=1000000*MinLot/10*Point*BazCours/Bid;
}
// ----- нормализуем полученную стоимость пункта ------
PointPrise=NormalizeDouble(PointPrise,2);
ryn_PointPrise=NormalizeDouble(ryn_PointPrise,2);

// ========== вычисляем максимальный стоп-лосс для указанного пользователем лота =========================================

//------ смотрим, сколько раз минимальный лот укладывается в пользовательском -------------
double iMinLot=MinLot;
int SchLots=0;//сколько минимальных лотов укладывается в пользовательском

if(Lot==MinLot){SchLots=1;}
else if(Lot>MinLot){
while(iMinLot iMinLot=iMinLot+LotStep;
SchLots++;
}
}  
//теперь вычисляем уровень стоп-лосса
SL_PNT=normRisk*normDepozit/PointPrise/SchLots;
SL_PNT=NormalizeDouble(SL_PNT,0);




// ========== вычисляем максимальный лот для указанного пользователем стоп-лосса =========================================

// ----- смотрим, какой стоп-лосс получится при минимальном лоте -------------
double jj=1;
ryn_SL=normRisk*normDepozit/ryn_PointPrise/jj;
ryn_SL=NormalizeDouble(ryn_SL,0);
// ----- смотрим, сколько раз пользовательский стоп-лосс умещается в стоп-лоссе минимального лота
int SchSL=0;//сколько пользовательских стоп-лоссов умещается в максимальном стоп-лоссе при минимальном лоте

if(StopLoss==ryn_SL){SchSL=1;}
else if(StopLoss double iStopLoss=StopLoss;
while(iStopLoss iStopLoss=iStopLoss+iStopLoss;
SchSL++;
}
}  
//----- теперь просчитываем искомый лот -------------
ryn_Lot=SchSL*MinLot;




// ------------ выводим результаты ----------------
Alert("Минимально допустимый уровень стоп-лосса = ",MinLevel," пунктов");
Alert("Стоимость пункта при минимальном ",MinLot," лоте = ",ryn_PointPrise," $");
Alert("Стоимость пункта при лоте ",Lot," = ",PointPrise," $");
Alert(Risk," процентов от депозита = ",normRiskPersent," $");
Alert("Денег на счету = ",normDepozit," $");
Alert("--------");
Alert("Максимальный лот = ",ryn_Lot);
Alert(SMB," Рассчёт лота для стоп-лосса = ",StopLoss," пунктов :");
Alert("--------");
Alert("Максимальный стоп-лосс = ",SL_PNT," пунктов");
Alert(SMB," Рассчёт стоп-лосса для лота = ",Lot," :");
Alert (t1);
}

return(0);
}
//+------------------------------------------------------------------+
//| Конец работы скрипта                                             |
//+------------------------------------------------------------------+
 
Я что-то не увидел мест, где следовало бы переделывать скрипт, ошибки увидел (скобок мало) Расставьте правильно скобки, сделайте стоплосс в десять раз больше и запустите.
 
Roger писал(а) >>
Я что-то не увидел мест, где следовало бы переделывать скрипт, ошибки увидел (скобок мало) Расставьте правильно скобки, сделайте стоплосс в десять раз больше и запустите.

Я бы хотел всегда оставаться с реальными значениями Стоп-Лосса, и т.д. Т.е. если 30, то писать 30, а не 300 - будет ли достаточным добавить

следующее? Где именно следует это разместить? - можно в init-e?

   double NumberOfDigitsAfterDot = MarketInfo(Symbol(),MODE_DIGITS);

   if(NumberOfDigitsAfterDot==3   ||   NumberOfDigitsAfterDot==5) {
      StopLoss = StopLoss*10;
   }

Спасибо!

 
//теперь вычисляем уровень стоп-лосса
SL_PNT=normRisk*normDepozit/PointPrise/SchLots;
SL_PNT=NormalizeDouble(SL_PNT,0);

Вроде бы здесь надо: SL_PNT=NormalizeDouble(SL_PNT,0)*10;
Но не уверен, что только здесь.

А это что?? // ----- смотрим, какой стоп-лосс получится при минимальном лоте -------------
Стопы вычисляются в зависимости от депо??? Прикольно. А я обычно определяю цели, в зависимости от этого стопы, ну и т.д.

 
infinum13 писал(а) >>

Вроде бы здесь надо: SL_PNT=NormalizeDouble(SL_PNT,0)*10;
Но не уверен, что только здесь.

А это что?? // ----- смотрим, какой стоп-лосс получится при минимальном лоте -------------
Стопы вычисляются в зависимости от депо??? Прикольно. А я обычно определяю цели, в зависимости от этого стопы, ну и т.д.

Помимо всего, скрипт показывает максимальную величину допустимого Стоп-Лосса при наименьшем лоте

- может быть полезным, Например, когда хочется узнать можно ли вообще открыть сделку с требуемым С-Л не нарушая критериев ММ.

 

Что означает 1000 000 в этой строчке и что 10?

PointPrise = 1000000*Lot/10*Point;
 

В чем проблема? Вставьте в начале скрипта...

   if(Digits==5 || Digits==3)
   {
// В этом блоке меняете любые параметры, связанные с пунктами...
      TP*=10;
      SL*=10;

   }
 

Спасибо!

Неужели и в 5-й версии будет такая же чехарда с 4-х и 5-значными числами?

Кто-нибудь в курсе? Это же должно решаться еще на уровне МТ, а не пользовательских скриптов!

 
chief2000 >>:

Я бы хотел всегда оставаться с реальными значениями Стоп-Лосса, и т.д. Т.е. если 30, то писать 30, а не 300

пишите 300 для пятизнаков, потому что это именно 300 пунктов а не 30 как вам кажется ;)

 
GarF1eld писал(а) >>

пишите 300 для пятизнаков, потому что это именно 300 пунктов а не 30 как вам кажется ;)

С точки зрения определений Вы правы, но вот только кому это нужно - работать с 15 пипсами, одновременно подразумевая что это равно 1.5 "реальным"? По мне, так работать с 1.5 куда проще. Тем более, не надо было бы переписывать старые Индикаторы и Советники под 5-чисел (речь не только об этом конкретном скрипте).