Вопросы оператора цикла "для - страница 4

 

Саймон,

Хорошо, давайте я попробую добавить уровень стопа в советник, просто для примера.

Ах-ха! Уровень заморозки для USDJPY равен 0, а уровень стопа - 30.

Я предполагаю, что 30 означает 3, потому что брокер пятизначный. Я попробовал использовать MODE_SPREAD и получил 20. Очевидно, что спред по USDJPY не 20, а ;) 2.0. Можно также сказать, что 2 пункта эквивалентны 20 пунктам.

Спасибо.

 

Подсказка для вас. . . .

 

Саймон,

Похоже, что это снова проблема выбора заказа.

Функция OrderClose() пытается закрыть ордер (не ордер USDJPY). Она пытается закрыть ордер на графике EURUSD.

Функция OrderPrint() ранее была выбрана до ее выполнения и четко соответствует своему назначению.

Красный цвет, обведенный вокруг недействительной цены, должен означать WRONG.

Зеленый цвет, обведенный вокруг USDJPY, должен означать ПРАВДУ.

Поэтому, если все верно, я должен сосредоточиться на красном круге и выбрать ордер до выполнения функции OrderClose().

Спасибо.

 
WhooDoo22:


что такое Bid и Ask?

Ask - это последняя известная цена продавца (цена спроса) для текущего символа.

Bid - это последняя известная цена покупателя (цена предложения, цена бида) текущего символа.

Вы уже знаете причину неудачного закрытия... просто подумайте внимательно в течение минуты.


Посмотрите на свой код, какую цену вы используете для закрытия ордера?

 

Саймон,

Ask/Bid - это последняя известная цена продавца/покупателя для текущего символа.

Цена, по которой советник хочет закрыть ордер, - это цена символа EURUSD.

Почему советник зависит от размещения на графике USDJPY для закрытия своего ордера? Функция OrderSelect() предназначалась для выбора номера тикета, и как только номер тикета был выбран, советник мог бы затем выбрать

Очевидно, советник должен находиться на графике символа USDJPY, чтобы закрывать ордера на нем.


Зачеркните все, что я только что сказал.

Вот решение. Ошибка кроется в третьем параметре. Я рассматриваю возможность указать символ и ПОТОМ поместить переменную ask/bid в его параметр (местоположение 3-го параметра функции OrderClose()). Это должно устранить все неясности в мыслях.

Спасибо.

 
WhooDoo22:.

Это и есть решение. Ошибка кроется в третьем параметре. Я рассматриваю возможность указать символ и ПОТОМ поместить переменную ask/bid в его параметр (местоположение 3-го параметра функции OrderClose()). Это должно устранить любые неясности в мыслях.

Спасибо.

Bid и Ask являются предопределенными переменными и относятся ТОЛЬКО к текущему графику, на котором находится советник. Если вам нужен Bid или Ask для символа, отличного от графика, на котором находится советник, вы не можете использовать предопределенные переменные Bid и Ask. Однако вы можете использовать MarketInfo() ;-)
 

Саймон,

Ошибка кроется в третьем параметре функции OrderClose(), потому что ;) Ask/Bid - это последняя известная цена продавца/покупателя для текущего символа. Если "для текущего символа" означает текущий график, на котором установлен советник, то это может быть немного непонятно. Следует помнить, что MQL4 существует уже давно и имеет свои уникальные методы иллюстрации и представления.

Решение состоит в том, чтобы заменить предопределенные переменные Ask/Bid на альтернативу, например...

// solution 1.

MarketInfo("USDJPY",MODE_BID);

// solution 2.

MarketInfo("USDJPY",MODE_ASK);

Что вы на это скажете?


Я добавил версию этого советника, которая имеет возможность печатать информацию об ордере USDJPY и закрывать его независимо от графика, на котором он размещен. Я еще не подтвердил, изменил ли он SL и TP ордера USDJPY, но подтвержу после проверки. Советник выдает последнюю ошибку, которую несложно устранить. В настоящее время я работаю над этим. Вот снимок считывания ошибки:

ошибка недействительного билета

Спасибо.

Файлы:
 
WhooDoo22:

Саймон,

Ошибка кроется в третьем параметре функции OrderClose(), потому что ;) Ask/Bid - это последняя известная цена продавца/покупателя для текущего символа. Если "для текущего символа" означает текущий график, на котором установлен советник, то это может быть немного непонятно. Я должен помнить, что MQL4 существует уже давно и имеет свои уникальные методы иллюстрации и представления.

Решение состоит в том, чтобы заменить предопределенные переменные Ask/Bid альтернативой, например...

Что вы на это скажете?


Я добавил версию этого советника, которая имеет возможность печатать информацию об ордере USDJPY и закрывать его независимо от того, на каком графике он установлен. Я еще не подтвердил, изменил ли он SL и TP ордера USDJPY, но подтвержу после проверки. Советник выдает последнюю ошибку, которую несложно устранить. В настоящее время я работаю над этим. Вот снимок чтения ошибки:


Спасибо.

И теперь вы видите ограничения вашего кода. . у вас больше нет ордера USDJPY, поэтому ваш while находит ордер на позиции 0 и это не USDJPY, затем он находит следующий на позиции 1 и это не USDJPY, затем он смотрит на позицию 2 и OrderSelect() терпит неудачу, это завершает while, но остальная часть кода затем выполняется, это дает неудачный OrderModify(), неудачный OrderPrint(), неудачный OrderType() и неудачный OrderClose() . . Что делает эта GetLastError() сама по себе?
 

Саймон,

Оператор цикла 'while' выполняется следующим образом: Если выражение истинно, оператор выполняется до тех пор, пока выражение не станет ложным. Если выражение ложно, управление передается следующему оператору.

Цель кода в блоке SRC, приведенного ниже, состоит в том, чтобы сделать следующее:

Пока переменная 'i' (содержащаяся в функции OrderSelect() ) НЕ является номером позиции билета USDJPY И символ ордера не является USDJPY,переменная 'i' увеличивается до тех пор, пока переменная 'i' не станет номером позиции билета USDJPY И символом ордера станет USDJPY. Как только цикл 'while' становится ложным, управление передается ниже, к следующей строке кода.

Я привел заголовок и тело цикла 'while' для наглядности.

while(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()!="USDJPY")

i++;

Я полагаю, что вы понимаете, как цикл 'while' находит билет на валютной паре USDJPY, даже если в данный момент на валютной паре нет билета, но ;) Боюсь, что нет.

Как цикл 'while' может найти тикет на графике USDJPY, если на графике USDJPY нет ордера, который нужно найти?

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

Спасибо.

 
WhooDoo22:


Я полагаю, что вы понимаете, как цикл 'while' находит билет на валютную пару USDJPY даже без того, чтобы билет в данный момент находился на валютной паре, но ;) Боюсь, что нет.

Как цикл 'while' может найти тикет на графике USDJPY, если на графике USDJPY нет ордера, который нужно найти?

Я полагаю, вы написали что-то вроде того, что ордер находится в позиции 0. Не могли бы вы рассказать об этом подробнее или, возможно, дать ссылку для изучения?

Если вы хотите писать код для себя самостоятельно, то вам нужно выполнить задание 3 человек, может даже 4. Человека, который составляет документ с требованиями, инженера-программиста и инженера по тестированию. Недостаточно знать синтаксис задом наперед и уметь писать код. Вы должны понимать, какую проблему вы пытаетесь решить и как вы собираетесь ее решить, а также вы должны знать, как протестировать код, чтобы убедиться, что он соответствует требованиям.

На базовом уровне это означает пройтись по коду строка за строкой и убедиться, что он делает то, что вы хотели. Обычно это делается с помощью диапазона значений для каждой переменной, начиная с их минимального значения, через типичные значения и заканчивая максимальным значением.


Давайте сделаем это на примере цикла while...

Когда вы объявляете переменную int , не задавая ее значения, ее начальное значение равно 0, поэтому, когда вы объявляете i (почему бы не использовать более описательное имя переменной?) она имеет значение 0, поэтому при первом прохождении цикла whilei равно 0, поэтому OrderSelect() пытается выбрать ордер в позиции 0, если это сработает, то вызов OrderSymbol() вернет правильное имя символа для ордера в позиции 0, и если это не "USDJPY", то выражение(OrderSymbol() !="USDJPY" ) приведет к значению true , если OrderSelect() будет true и проверка символа будет true,true и true =true и следующая строка кода (это внутри цикла while) будет выполнена.

Теперьi равно 1, OrderSelect() выбирает ордер в позиции 1, поэтому получается значение true, проверка символа не находит символаUSDJPY, поэтому возвращается true, снова true и true = true , поэтому снова выполняется i++

Теперьi
равно 2, OrderSelect() пытается выбрать ордер на позиции 2, но не получается. . есть только 2 открытых ордера, на позициях 0 и 1, поэтому OrderSelect() возвращает false, что делает OrderSymbol()? нет выбранного ордера. ... . но даже если он по какой-то странной причине вернет true , OrderSelect() уже вернул false,false и true = false ... цикл while завершился иi установлен в 2.

Теперь проработайте остальную часть кода, помня, чтоi имеет значение 2. ...

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