Можно ввести ограничение по минимальному значению гисто - меньше порогового, значит 0. Порог вывести в настройки для универсальности.Подскажите, есть ли способ стабилизации значений индикатора возле нулевой отметки, чтобы поменьше шумело?
Посмотреть вложение 474479
Уважаемый выручите еще разВставь в функцию OnInit строку:
int OnInit()
{
if(AccountNumber()!=123456789) {Print("Wrong account!"); return(INIT_FAILED);}
где 123456789 - это номер счета для привязки - вводишь нужный.
//+------------------------------------------------------------------------------------------------------------------+//
double Risk = 4.6;
double D = 4.7;
double Lot=NormalizeDouble(AccountBalance()/100*Risk/(MarketInfo(Symbol(),MODE_TICKVALUE)*100*D),2);
if (Lot > MarketInfo(Symbol(),MODE_MAXLOT))Lot=MarketInfo(Symbol(),MODE_MAXLOT);
if (Lot < MarketInfo(Symbol(),MODE_MINLOT))Lot=MarketInfo(Symbol(),MODE_MINLOT);
Comment("\n"
"Balance " ,AccountBalance() , "\n"
"Risk " ,Risk , "\n"
"Lot " ,Lot , "\n"
"D " ,D , "\n"
);
if( OrdersTotal()==0 && Volume[0] > 5){
int tic = OrderSend(Symbol(),OP_BUY,Lot,Ask,5,0,0,"",55555,0,clrBlue);
}
// Если Balance 10000
// Итоговый Лот = 0.98
//+------------------------------------------------------------------------------------------------------------------+//
Спасибо за помощь, но все так же не проходит валидацию...error 131. Это неправильный объём лота. Какие у вас значения "Risk" и "D" Проверьте их. А так же: "AccountBalance()"
Эти, основные три значения, влияют на расчёт лота.
А так же, если вы на выходные, гоняли его в тестере. То лот, типа 0.01. может дать ошибку. Меняйте его на 0.1 в тестере на выходных.
Вроде бы всё, что знаю..
Так. Ошибки нет.
Проверяйте.
PHP://+------------------------------------------------------------------------------------------------------------------+// double Risk = 4.6; double D = 4.7; double Lot=NormalizeDouble(AccountBalance()/100*Risk/(MarketInfo(Symbol(),MODE_TICKVALUE)*100*D),2); if (Lot > MarketInfo(Symbol(),MODE_MAXLOT))Lot=MarketInfo(Symbol(),MODE_MAXLOT); if (Lot < MarketInfo(Symbol(),MODE_MINLOT))Lot=MarketInfo(Symbol(),MODE_MINLOT); Comment("\n" "Balance " ,AccountBalance() , "\n" "Risk " ,Risk , "\n" "Lot " ,Lot , "\n" "D " ,D , "\n" ); if( OrdersTotal()==0 && Volume[0] > 5){ int tic = OrderSend(Symbol(),OP_BUY,Lot,Ask,5,0,0,"",55555,0,clrBlue); } // Если Balance 10000 // Итоговый Лот = 0.98 //+------------------------------------------------------------------------------------------------------------------+//
Уважаемый выручите еще раз
Подскажите что надо исправить советник выдает ошибку OrderSend error 131
Lot=NormalizeDouble(AccountBalance()/100*Risk/(MarketInfo(Symbol(),MODE_TICKVALUE)*100*D),2);
if (Lot<MarketInfo(Symbol(),MODE_MINLOT))Lot=MarketInfo(Symbol(),MODE_MINLOT);
bool CheckMoneyForTrade(string symb, double lots, int type)
{
double free_margin=AccountFreeMarginCheck(symb,type,lots);
if(free_margin<0)
{
string oper =(type==OP_BUY)?"Buy":"Sell";
Print("Not enough money for ",oper," ",lots," ",symb," Error code=",GetLastError());
return(false);
}
return(true);
}
Я в программирование полный ноль...Код:bool CheckMoneyForTrade(string symb, double lots, int type) { double free_margin=AccountFreeMarginCheck(symb,type,lots); if(free_margin<0) { string oper =(type==OP_BUY)?"Buy":"Sell"; Print("Not enough money for ",oper," ",lots," ",symb," Error code=",GetLastError()); return(false); } return(true); }
Извините, если вы "полный ноль", то я и не знаю тогда, как объяснить...Я в программирование полный ноль...
Подскажите это вставить вместо моего кода ?
Или ?
Я не прошу объяснять, я прошу исправить или заменить код, чтоб убрать ошибкиИзвините, если вы "полный ноль", то я и не знаю тогда, как объяснить...
Эта функция проверяет достаточно ли средств для открытия позиции и не имеет отношения к 131 ошибке. Не стоит вместо неё что то вставлять. Её можно не вызывать, то тогда если не хватит денег вылезет ошибка при открытии позиции.Я в программирование полный ноль...
Подскажите это вставить вместо моего кода ?
Или ?
Сделал так:Эта функция проверяет достаточно ли средств для открытия позиции и не имеет отношения к 131 ошибке. Не стоит вместо неё что то вставлять. Её можно не вызывать, то тогда если не хватит денег вылезет ошибка при открытии позиции.
Там же написано что функция OrderSend выдаёт эту ошибку. Значит ей лот кривой достаётся. Рихтовать надо.
Вы авторитетно это утверждаете ?)Эта функция проверяет достаточно ли средств для открытия позиции и не имеет отношения к 131 ошибке. Не стоит вместо неё что то вставлять. Её можно не вызывать, то тогда если не хватит денег вылезет ошибка при открытии позиции.
Там же написано что функция OrderSend выдаёт эту ошибку. Значит ей лот кривой достаётся. Рихтовать надо.
extern double FixedLots = 0.01; // Lot Size:
//—————————————————————————————————————————————————————|
double NormalizeLots(double lot)
{
double lotstep = MarketInfo(Symbol(),MODE_LOTSTEP);
double lots = NormalizeDouble(lot/lotstep,0)*lotstep;
lots = fmax(lots,MarketInfo(Symbol(),MODE_MINLOT));
lots = fmin(lots,MarketInfo(Symbol(),MODE_MAXLOT));
return(lots);
}
//————————————————————————————————————————————————————————————————————|
void OnTick()
{
double Lots = NormalizeLots(FixedLots);
if(CheckMoneyForTrade(_Symbol,Lots,OP_BUY)&& ...условия для покупки)
{
// Ордер на покупку
}
if(CheckMoneyForTrade(_Symbol,Lots,OP_SELL)&& ...условия для продажи)
{
// Ордер на продажу
}
}
//————————————————————————————————————————————————————————|
bool CheckMoneyForTrade(string symb, double lots, int type)
{
double free_margin=AccountFreeMarginCheck(symb,type,lots);
if(free_margin<0)
{
string oper =(type==OP_BUY)? "Buy":"Sell";
Print("Not enough money for ",oper," ",lots," ",symb," Error code=",GetLastError());
return(false);
}
return(true);
}
Не компилируется, ошибки выдаетПолная конструкция...)
Код:extern double FixedLots = 0.01; // Lot Size: //—————————————————————————————————————————————————————| double NormalizeLots(double lot) { double lotstep = MarketInfo(Symbol(),MODE_LOTSTEP); double lots = NormalizeDouble(lot/lotstep,0)*lotstep; lots = fmax(lots,MarketInfo(Symbol(),MODE_MINLOT)); lots = fmin(lots,MarketInfo(Symbol(),MODE_MAXLOT)); return(lots); } //————————————————————————————————————————————————————————————————————| void OnTick() { double Lots = NormalizeLots(FixedLots); if(CheckMoneyForTrade(_Symbol,Lots,OP_BUY)&& ...условия для покупки) { // Ордер на покупку } if(CheckMoneyForTrade(_Symbol,Lots,OP_SELL)&& ...условия для продажи) { // Ордер на продажу } } //————————————————————————————————————————————————————————| bool CheckMoneyForTrade(string symb, double lots, int type) { double free_margin=AccountFreeMarginCheck(symb,type,lots); if(free_margin<0) { string oper =(type==OP_BUY)? "Buy":"Sell"; Print("Not enough money for ",oper," ",lots," ",symb," Error code=",GetLastError()); return(false); } return(true); }
Значит не судьба !)Не компилируется, ошибки выдает
У меня коде нет фиксированного лота
Мне интересно для общего развития, как может ваш код компилироваться если у вас фикс лот,Значит не судьба !)
)))Извините, если вы "полный ноль", то я и не знаю тогда, как объяснить...
Ну тогда как-то так:Мне интересно для общего развития, как может ваш код компилироваться если у вас фикс лот,
а у меня в коде параметр риск ?
enum RiskCalc{AccountBalance,AccountEquity,AccountFreeMargin};
extern double FixedLots = 0.01; // Lot Size:
extern bool PropotinalLots = false; // Money Management:
extern RiskCalc RiskType = AccountBalance; // Risk Calculate Type:
extern double PercentLots = 0.01; // Risk %
double Lots,risk;
int DigitLot=0;
//————————————————————————————————————————————————————————|
int OnInit()
{
if(MarketInfo(Symbol(),MODE_LOTSTEP)>= 0.01) DigitLot=2;
if(MarketInfo(Symbol(),MODE_LOTSTEP)>= 0.1) DigitLot=1;
if(MarketInfo(Symbol(),MODE_LOTSTEP)>= 1) DigitLot=0;
return(INIT_SUCCEEDED);
}
//———————————————————————————————————————————————————————————|
void LotsSize()
{ Lots = FixedLots;
if(RiskType == AccountEquity) {risk = AccountEquity();}
if(RiskType == AccountBalance) {risk = AccountBalance();}
if(RiskType == AccountFreeMargin) {risk = AccountFreeMargin();}
if(Lots<MarketInfo(Symbol(),MODE_MINLOT)) Lots = MarketInfo(Symbol(),MODE_MINLOT);
if(Lots>MarketInfo(Symbol(),MODE_MAXLOT)) Lots = MarketInfo(Symbol(),MODE_MAXLOT);
if(PropotinalLots){Lots = NormalizeDouble(risk * PercentLots/100.0, DigitLot);}
}
//————————————————————————————————————————————————————————————————————————————————|
void OnTick()
{
LotsSize();
if(CheckMoneyForTrade(_Symbol,Lots,OP_BUY)&& ...условия для покупки)
{
// Ордер на покупку
}
if(CheckMoneyForTrade(_Symbol,Lots,OP_SELL)&& ...условия для продажи)
{
// Ордер на продажу
}
}
//————————————————————————————————————————————————————————|
bool CheckMoneyForTrade(string symb, double lots, int type)
{
double free_margin=AccountFreeMarginCheck(symb,type,lots);
if(free_margin<0)
{
string oper =(type==OP_BUY)? "Buy":"Sell";
Print("Not enough money for ",oper," ",lots," ",symb," Error code=",GetLastError());
return(false);
}
return(true);
}
Мне тоже помощь нужна.
Беда с заполнением массива. Сортировка цен открытых позиций.
Нужен массив, который заполняется ценами, открываемых позиций.
С такими условиями:
1) Заполнение от нулевого индекса.
2) Заполнение ценами, от наиМеньшей цены к наиБольшей цене, из открытых позиций.
Прикрепляю тест_expert. Это то, что получилось сделать, а именно: "от наиБольшей цены к наиМеньшей - индекс от нуля"
A вот, "от наиМеньшей цены к наиБольшей - индекс от нуля", вообще ни как не делается... Прошу помощи!!!
п.с.
В 300 строке, горизонтальная линия. Визуальная Метка, для максимальной цены. если мешает, уберите.