Советник для каждой валютной пары - какой код открыть только один раз для каждой валютной пары? - страница 3

 

Я изменил механизм закрытия с:

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(....)

и теперь все работает, как ожидалось. Хотя я не понимаю, почему так происходит. Потому что я действительно не понимаю дополнительные строки во втором коде. Но спасибо вам, ребята!

 
grey.unit:

Я меняю механизм закрытия с:

на

и теперь все работает, как ожидалось. Спасибо вам, ребята!

Возможно, это не всегда будет работать ... при закрытии открытых ордеров или удалении отложенных ордеров в цикле вы ДОЛЖНЫ вести отсчет вниз, а не вверх ... вам нужно изменить ваш цикл. И вам нужно вернуть chack обратно в Symbol() ... иначе советник для EURUSD будет потенциально закрывать ордера для GBPUSD ... что вам нужно было сделать, так это избавиться от continue . .. или сделать == в !=
 
grey.unit:

Я изменил механизм закрытия с:

на

и теперь все работает, как ожидалось. Хотя я не понимаю, почему так происходит. Потому что я действительно не понимаю дополнительные строки во втором коде. Но спасибо вам, ребята!

Ваш второй код правильный, но немного забавный. Откройте 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) 
         {   
 
grey.unit:

Просто чтобы понять вас правильно. Вы говорите, что если я изменю первый код на:

то он также должен работать? Потому что я попробовал это, и он снова открывает только один ордер на валютную пару.

Или если я изменю второй код на (k++ на k--), то он также открывает только одну сделку на валютную пару.

Я говорю о первом коде, о цикле, который вы используете, где вы закрываете ордера ... он должен уменьшаться. ... иначе вы пропустите ордера. Я вижу, что вы убрали continue и добавили { } скобки, очень хорошо :-)

Открытие одного ордера на валютную пару или одного ордера в целом?

 
RaptorUK:

Открывать по одному ордеру на валютную пару или по одному ордеру в целом?

Да, в целом, конечно. Хорошо, второй код:


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 ++)

На самом деле я бы изменил его на что-то вроде этого:

for (int j = OrdersTotal()+1 ; j > OrdersTotal(); j --) 
   {

Эта строка открывает только один ордер на валютную пару (по желанию!).

Является ли цикл правильным в отношении этой проблемы сейчас?

RaptorUK:

Возможно, это не всегда сработает... при закрытии открытых ордеров или удалении отложенных ордеров в цикле вы ДОЛЖНЫ вести отсчет вниз, а не вверх... вам нужно изменить цикл. И вам нужно вернуть chack обратно в Symbol() ... иначе советник для EURUSD будет потенциально закрывать ордера для GBPUSD ... что вам нужно было сделать, так это избавиться от continue . ... или превратить== в !=
 
grey.unit:

Да, в целом, конечно. Хорошо, второй код:


Когда мы говорим о цикле, я думаю, вы имеете в виду это:

На самом деле я бы изменил его на что-то вроде этого:

Эта строка открывает только один ордер для каждой валютной пары (как желательно!).

Является ли цикл правильным для решения этой проблемы?

Нет, сделайте так...

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.

 
Хорошо, большое спасибо за помощь!
 
RaptorUK:

Нет, сделайте так...

Первая позиция ордера - 0, поэтому если у вас 5 ордеров, то позиции будут 0, 1, 2, 3, 4 ... последняя - OrdersTotal() - 1 ... поэтому для обратного отсчета вы начинаете с OrdersTotal()-1 и заканчиваете на 0.

Таким образом, это должно выглядеть так:

for (int j = OrdersTotal()-1 ; j = 0 ; j --) 

потому что вы написали это:

for (int j = OrdersTotal()-1 ; j >= 0 ; j --) 

или я ошибаюсь?

 
grey.unit:

Так что это должно выглядеть следующим образом:

потому что вы это написали:

или я ошибаюсь?

Вы глубоко ошибаетесь. Ваш код никогда не будет выполнен!!! Используйте код RaptorUK.