https://forum.mql4.com/ru/22157
Огромное спасибо это все объясняет я теперь буду составлять программы с учетом изложенного. Для начала предполагаю избавиться максимально от использования чисел с плавающей запятой до момента отсылки или модификации ордера (этот вопрос я задавал про выставление, а фактичиски это чудо творится и при выставлении и при модификации ордеров). Будем боротся. Еще раз огромное спасибо.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Уважаемые господа, может кто знает откуда или из-за чего возникает такой эффект (ошибка 130). Есть цикл в советнике по подготовке необходимых данных для отправки отложенного ордера.
int perebor;
//-------
int init()
{
return(0);
}
int deinit()
{
return(0);
}
int start()
{
//----
static int old_bars = 0; // запомним число известных баров
if (old_bars != iBars("EURJPY",PERIOD_M1)) // если получен новый бар
{
Sleep(15000); //-15 сек
for(int i = 100; i <= 110; i++) // здесь усьанавливается началное и кончное значения шагов
{
perebor=i;
ord02();
} //конец цикла
Print("ордера проверены");
в функции ord02() производится расчет переменных на основе уже полученной perebor(i) и нижеприведенных переменных
string koment = perebor;
int MagName = perebor;
double prof = NormalizeDouble(GlobalVariableGet(perebor+"prof")*100,0);
mn=NormalizeDouble(GlobalVariableGet(perebor+"n")*100,0);
mx=NormalizeDouble(GlobalVariableGet(perebor+"x")*100,0);
stop=NormalizeDouble(perebor,0);
vvv=0.1;
tip=GlobalVariableGet("tip");
изначально глобальные пеерменные вводятся с 2 мя знаками после запятой 120.08 или 120.80
в меню глобальных переменных выглядят по разному а именно: 120.08 и 120.8
участвуют в расчетах примерно так
zena=mn+prof-stop;
sl=NormalizeDouble(zena,0)-stop;
tp=NormalizeDouble(zena,0)+prof;
отсылается ордер в таком виде
OrderSend("EURJPY",tip,vvv,NormalizeDouble(zena*Point,Digits),0,NormalizeDouble(sl*Point,Digits),NormalizeDouble(tp*Point,Digits),koment,MagName,0,CLR_NONE);
Так вот: во время выполнения в течение одного цикла, то есть подряд ордера одного и того же типа могут выполнится и не выполнится.
Поясняю: например при выставлении отложенного ордера BuyLimit (например должны выполнится i= 100, 105, 106, и 109) ордера с номерами 100,105, и 109 выполнятся а ордер с номером 106 нет или ордера 105, 106, выполняться а 109 и 100 не выполнятся.
Сам думаю что возможно это как-то связано с нормализацией данных до 2 знаков после запятой, Однако в различных вариантах пробовал использовать как прямое указание на сокращение NormalizeDouble(zena,0) или NormalizeDouble(zena,2) так и через Digits.
Вот никак не могу понять где я ошибаюсь. Да, других вычислений для выставления ордера не провожу.