for (int j = 0; j < OrdersTotal(); j ++)
{
if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) // If there is the next one
{ // Analyzing orders: if (OrderSymbol()==Symbol())continue; // Another security //--------------Exit criteria (Exit Buy) if (CloseBuy1_1 >= CloseBuy1_2) Order = SIGNAL_CLOSEBUY; // Trigger for CloseBuy (more can be added)if (CloseSell1_1 <= CloseSell1_2) Order = SIGNAL_CLOSESELL; // Trigger for Closesell (more can be added)if (Order == SIGNAL_CLOSEBUY)
{
OrderClose()
на
for (int k = 0; k < OrdersTotal(); k ++)
{
OrderSelect(k, SELECT_BY_POS, MODE_TRADES);
if(OrderType() <= OP_SELL && OrderSymbol() == Symbol())
{
if(OrderType() == OP_BUY)
{
//--------------Exit criteria (Exit Buy) if (CloseBuy1_1 >= CloseBuy1_2) Order = SIGNAL_CLOSEBUY; // Trigger for CloseBuy (more can be added)if (CloseSell1_1 <= CloseSell1_2) Order = SIGNAL_CLOSESELL; // Trigger for Closesell (more can be added)if (Order == SIGNAL_CLOSEBUY)
{
OrderClose(....)
и теперь все работает, как ожидалось. Хотя я не понимаю, почему так происходит. Потому что я действительно не понимаю дополнительные строки во втором коде. Но спасибо вам, ребята!
и теперь все работает, как ожидалось. Спасибо вам, ребята!
Возможно, это не всегда будет работать ... при закрытии открытых ордеров или удалении отложенных ордеров в цикле вы ДОЛЖНЫ вести отсчет вниз, а не вверх ... вам нужно изменить ваш цикл. И вам нужно вернуть chack обратно в Symbol() ... иначе советник для EURUSD будет потенциально закрывать ордера для GBPUSD ... что вам нужно было сделать, так это избавиться от continue . .. или сделать == в !=
и теперь все работает, как ожидалось. Хотя я не понимаю, почему так происходит. Потому что я действительно не понимаю дополнительные строки во втором коде. Но спасибо вам, ребята!
Ваш второй код правильный, но немного забавный. Откройте MetaEditor, окно навигатора (Ctrl + D), вкладку словарь и выберите MQL4 Reference > Standard constants > Trade operations.
RaptorUK: Возможно, это не всегда будет работать ... при закрытии открытых ордеров или удалении отложенных ордеров в цикле вы ДОЛЖНЫ считать вниз, а не вверх ... вам нужно изменить ваш цикл. И вам нужно вернуть chack обратно в Symbol() ... иначе советник для EURUSD будет потенциально закрывать ордера для GBPUSD ... что вам нужно сделать, так это избавиться от continue . .. или сделать == в !=
Просто чтобы понять вас правильно. Вы говорите, что если я изменю первый код на:
for (int j = 0; j < OrdersTotal(); j --)
{
if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) // If there is the next one
{ // Analyzing orders: if (OrderSymbol()==Symbol()) // Another security
{
//--------------Exit criteria (Exit Buy) if (CloseBuy1_1 >= CloseBuy1_2) Order = SIGNAL_CLOSEBUY; // Trigger for CloseBuy (more can be added)if (CloseSell1_1 <= CloseSell1_2) Order = SIGNAL_CLOSESELL; // Trigger for Closesell (more can be added)if (Order == SIGNAL_CLOSEBUY)
{
OrderClose(....)
то он также должен работать? Потому что я попробовал это, и он снова открывает только один ордер на валютную пару.
Или если я изменю второй код на (k++ на k--), то он также открывает только одну сделку на валютную пару.
for (int k = 0; k < OrdersTotal(); k --)
{
OrderSelect(k, SELECT_BY_POS, MODE_TRADES);
if(OrderType() <= OP_SELL && OrderSymbol() == Symbol())
{
if(OrderType() == OP_BUY)
{
Просто чтобы понять вас правильно. Вы говорите, что если я изменю первый код на:
то он также должен работать? Потому что я попробовал это, и он снова открывает только один ордер на валютную пару.
Или если я изменю второй код на (k++ на k--), то он также открывает только одну сделку на валютную пару.
Я говорю о первом коде, о цикле, который вы используете, где вы закрываете ордера ... он должен уменьшаться. ... иначе вы пропустите ордера. Я вижу, что вы убрали continue и добавили { } скобки, очень хорошо :-)
Открытие одного ордера на валютную пару или одного ордера в целом?
Открывать по одному ордеру на валютную пару или по одному ордеру в целом?
Да, в целом, конечно. Хорошо, второй код:
for (int j = 0; j < OrdersTotal(); j ++)
{
if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) // If there is the next one
{ // Analyzing orders: if (OrderSymbol()==Symbol())continue; // Another security
Когда мы говорим о цикле, я думаю, вы имеете в виду это:
for (int j = 0; j < OrdersTotal(); j ++)
На самом деле я бы изменил его на что-то вроде этого:
Эта строка открывает только один ордер на валютную пару (по желанию!).
Является ли цикл правильным в отношении этой проблемы сейчас?
RaptorUK:
Возможно, это не всегда сработает... при закрытии открытых ордеров или удалении отложенных ордеров в цикле вы ДОЛЖНЫ вести отсчет вниз, а не вверх... вам нужно изменить цикл. И вам нужно вернуть chack обратно в Symbol() ... иначе советник для EURUSD будет потенциально закрывать ордера для GBPUSD ... что вам нужно было сделать, так это избавиться от continue . ... или превратить== в !=
Когда мы говорим о цикле, я думаю, вы имеете в виду это:
На самом деле я бы изменил его на что-то вроде этого:
Эта строка открывает только один ордер для каждой валютной пары (как желательно!).
Является ли цикл правильным для решения этой проблемы?
Нет, сделайте так...
for (int j = OrdersTotal()-1 ; j >= 0 ; j --) // start at OrdersTotal() -1 , finish when j = 0
Первая позиция ордера равна 0, поэтому если у вас 5 ордеров, то позиции 0, 1, 2, 3, 4 ... поэтому последняя позиция OrdersTotal() - 1 ... поэтому для обратного отсчета вы начинаете с OrdersTotal()-1 и заканчиваете на 0.
Первая позиция ордера - 0, поэтому если у вас 5 ордеров, то позиции будут 0, 1, 2, 3, 4 ... последняя - OrdersTotal() - 1 ... поэтому для обратного отсчета вы начинаете с OrdersTotal()-1 и заканчиваете на 0.
Я изменил механизм закрытия с:
на
и теперь все работает, как ожидалось. Хотя я не понимаю, почему так происходит. Потому что я действительно не понимаю дополнительные строки во втором коде. Но спасибо вам, ребята!
Я меняю механизм закрытия с:
на
и теперь все работает, как ожидалось. Спасибо вам, ребята!
Я изменил механизм закрытия с:
на
и теперь все работает, как ожидалось. Хотя я не понимаю, почему так происходит. Потому что я действительно не понимаю дополнительные строки во втором коде. Но спасибо вам, ребята!
Ваш второй код правильный, но немного забавный. Откройте MetaEditor, окно навигатора (Ctrl + D), вкладку словарь и выберите MQL4 Reference > Standard constants > Trade operations.
Возможно, это не всегда будет работать ... при закрытии открытых ордеров или удалении отложенных ордеров в цикле вы ДОЛЖНЫ считать вниз, а не вверх ... вам нужно изменить ваш цикл. И вам нужно вернуть chack обратно в Symbol() ... иначе советник для EURUSD будет потенциально закрывать ордера для GBPUSD ... что вам нужно сделать, так это избавиться от continue . .. или сделать == в !=
Просто чтобы понять вас правильно. Вы говорите, что если я изменю первый код на:
то он также должен работать? Потому что я попробовал это, и он снова открывает только один ордер на валютную пару.
Или если я изменю второй код на (k++ на k--), то он также открывает только одну сделку на валютную пару.
Просто чтобы понять вас правильно. Вы говорите, что если я изменю первый код на:
то он также должен работать? Потому что я попробовал это, и он снова открывает только один ордер на валютную пару.
Или если я изменю второй код на (k++ на k--), то он также открывает только одну сделку на валютную пару.
Я говорю о первом коде, о цикле, который вы используете, где вы закрываете ордера ... он должен уменьшаться. ... иначе вы пропустите ордера. Я вижу, что вы убрали continue и добавили { } скобки, очень хорошо :-)
Открытие одного ордера на валютную пару или одного ордера в целом?
Открывать по одному ордеру на валютную пару или по одному ордеру в целом?
Да, в целом, конечно. Хорошо, второй код:
Когда мы говорим о цикле, я думаю, вы имеете в виду это:
На самом деле я бы изменил его на что-то вроде этого:
Эта строка открывает только один ордер на валютную пару (по желанию!).
Является ли цикл правильным в отношении этой проблемы сейчас?
RaptorUK:
Возможно, это не всегда сработает... при закрытии открытых ордеров или удалении отложенных ордеров в цикле вы ДОЛЖНЫ вести отсчет вниз, а не вверх... вам нужно изменить цикл. И вам нужно вернуть chack обратно в Symbol() ... иначе советник для EURUSD будет потенциально закрывать ордера для GBPUSD ... что вам нужно было сделать, так это избавиться от continue . ... или превратить== в !=Да, в целом, конечно. Хорошо, второй код:
Когда мы говорим о цикле, я думаю, вы имеете в виду это:
На самом деле я бы изменил его на что-то вроде этого:
Эта строка открывает только один ордер для каждой валютной пары (как желательно!).
Является ли цикл правильным для решения этой проблемы?
Нет, сделайте так...
Первая позиция ордера равна 0, поэтому если у вас 5 ордеров, то позиции 0, 1, 2, 3, 4 ... поэтому последняя позиция OrdersTotal() - 1 ... поэтому для обратного отсчета вы начинаете с OrdersTotal()-1 и заканчиваете на 0.
Нет, сделайте так...
Первая позиция ордера - 0, поэтому если у вас 5 ордеров, то позиции будут 0, 1, 2, 3, 4 ... последняя - OrdersTotal() - 1 ... поэтому для обратного отсчета вы начинаете с OrdersTotal()-1 и заканчиваете на 0.
Таким образом, это должно выглядеть так:
потому что вы написали это:
или я ошибаюсь?
Так что это должно выглядеть следующим образом:
потому что вы это написали:
или я ошибаюсь?