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

 

Для каждой валютной пары я использую отдельный советник.

Чтобы проверить, нужно ли открывать позицию, я проверяю, нет ли открытого ордера "if (OrdersTotal<1)", но это блокирует все другие валютные пары для открытия позиций, и я упускаю возможности.

Другими словами: Я хочу открыть только одну позицию на валютную пару = несколько позиций должны быть возможны, но в разных валютных парах.

Какой код я должен использовать вместо "if (OrdersTotal<1)"? Кто-нибудь может мне помочь? Заранее благодарю за помощь.

 

Каждая валютная пара должна иметь свою собственную GlobalVariable, например, "MyEA_EURUSD".

Если бы вы ограничили советника одной сделкой в день, код был бы следующим:

string sCheck = "MyEA_" + Symbol();

datetime t = TimeCurrent();

datetime tTrade = t - TimeHour(t)*60*60 - TimeMinute(t)*60 - TimeSeconds(t);

if(!GlobalVariableCheck(sCheck)) GlobalVariableSet(sCheck, tTrade -PERIOD_D1 * 60);

if(GlobalVariableGet(sCheck) < tTrade) {

OrderSend(......);

GlobalVariableSet(sCheck, tTrade);

}

 

Извините, что возвращаю тему в топ, но у меня сейчас та же проблема. К сожалению, sxTed не ответил мне на этот вопрос. Потому что описание торгового времени - это нечто иное, чем количество ордеров для каждой валютной пары.

Я пытался модифицировать строки sxTed'а, но думаю, что я потерпел ужасную неудачу в решении этой проблемы:

string sCheck = "MyEA_" + Symbol();      // already the first error in the code, second quotes should be at the end of the line.

//I would correct this one to:
string sCheck = "MyEA_ + Symbol()";          //However symbol() is not a function anymore ??


int start ()
{

// Closing Orders here


if(!GlobalVariableCheck(sCheck))                    //checking Globalvariable, GV available so it becomes true (independently of what kind of GV we have)...

GlobalVariableSet(sCheck, Symbol() );               //.. assigning a new GlobalVariable to the function of the current symbol the EA is attached on (does it actually work like this?)

if(GlobalVariableGet(sCheck) == Symbol()) {         // checking if our Symbol is the one which the EA is attached on --> becomes true...


// Order Criteria (Open trades here)

// What now? Actually i'm missing any kind of numbers or smth that limits the open orders per currency pair.

ПРОСЬБА: не ссылайтесь на какую-либо литературу в этом месте или скажите мне нанять кого-то, я изучаю книгу прямо сейчас и застрял!!!

 
mqlfor:

Для каждой валютной пары я использую отдельный советник.

Чтобы проверить, нужно ли открывать позицию, я проверяю, нет ли открытого ордера "if (OrdersTotal<1)", но это блокирует все другие валютные пары для открытия позиций, и я упускаю возможности.

Другими словами: Я хочу открыть только одну позицию на валютную пару = несколько позиций должны быть возможны, но в разных валютных парах.

Какой код я должен использовать вместо "if (OrdersTotal<1)"? Кто-нибудь может мне помочь? Заранее благодарю за помощь.


int total=OrdersTotal(); int count = 0; int magno = 12345; for(int pos=0;pos<total;pos++) { if(OrderSelect(pos,SELECT_BY_POS) == false) continue; if (OrderMagicNumber() != magno) continue; if (OrderSymbol() != Symbol()) continue; count++; } // Теперь вы знаете, сколько ордеров на данный символ открыто этим советником. if (count < 1) { // сделайте что-нибудь - возможно, откройте ордер }
Помогло?
 
texto:

Помогает ли это?
Вам не нужно магическое число... просто используйте символ
 
texto:

Помогает ли это?
int total=OrdersTotal();

ограничивает общее количество открытых ордеров ВСЕХ валютных пар или нет?

Я вставил ваш код следующим образом

int total=OrdersTotal();
int count = 0;
for(int pos=0;pos<total;pos++) 
{
    if(OrderSelect(pos,SELECT_BY_POS) == false) continue;
    if (OrderSymbol() != Symbol()) continue;
    count++;
}

if (Sell_1_1 < Sell_1_2 && CloseSell1_1 > CloseSell1_2 && count < 1) Order = SIGNAL_SELL; // Trigger for Sell

if (Buy_1_1 > Buy_1_2 && CloseBuy1_1 < CloseBuy1_2 && count < 1) Order = SIGNAL_BUY;    // Trigger for Buy


if (order == SIGNAL_BUY)
{
OrderSend(...)
}   

и он все равно открывает только одну сделку. Что пытался сказать нам sxTed своей глобальной переменной?

 
grey.unit:

ограничивает общее количество открытых ордеров ВСЕХ валютных пар или нет?

Я вставил ваш код следующим образом

и он все равно открывает только одну сделку. Что пытался сказать нам sxTed своей глобальной переменной?

На скольких графиках работает ваш советник?
 
RaptorUK:
На скольких графиках работает ваш советник?
Для тестирования кода я открыл 5 графиков, но я хочу открыть N графиков. Количество не имеет значения.
 
grey.unit:
Для тестирования кода я открыл 5 графиков, но я хочу открыть N графиков. Количество не имеет значения.
Вы тестировали свой код на каждой паре по очереди, чтобы убедиться, что ваш советник откроет сделку на каждой паре независимо от того, что происходит с другими парами? Возможно, ваш советник открывает только одну сделку, потому что он открывает сделку только на одной конкретной паре....
 
Конечно. Когда у меня открыта сделка, скажем, по EURJPY, и я закрываю ее вручную, то, возможно, другой советник открывает сделку по другой валютной паре.
 
mqlfor:

Для каждой валютной пары я использую отдельный советник.

Чтобы проверить, нужно ли открывать позицию, я проверяю, нет ли открытого ордера "if (OrdersTotal<1)", но это блокирует все другие валютные пары для открытия позиций, и я упускаю возможности.

Другими словами: Я хочу открыть только одну позицию на валютную пару = несколько позиций должны быть возможны, но в разных валютных парах.

Какой код я должен использовать вместо "if (OrdersTotal<1)"? Кто-нибудь может мне помочь? Заранее благодарю за помощь.

Код должен быть таким :

 int Total_Order = OrdersTotal();
 for (pos = 0; pos <= Total_Order; pos ++)
      {
      if (OrderSelect (pos, SELECT_BY_POS) == true)
        {
        if (OrderSymbol () == Symbol ())
          {
          Print (":( Sorry already have that symbol opened ");
          // get outta here do something else
          break ;
          }
          else
          {
          Print ("No order opened for this symbol");
          Print ("Let\'s call waitress and order some drink :)");
          // do some order then break out and get out
          }
         }
       }
Причина обращения: