Как кодировать? - страница 250

 
mladen:

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

В данный момент он открывает и закрывает свою собственную сделку, но при этом закрывает все дополнительные существующие открытые сделки.

 

увеличить

Из частичного кода вот что я могу предложить. Если создать булевский параметр NoCloses, и если этот параметр установить в true, то он не должен закрывать ордера, если его применить как в данном фрагменте (если CB и CS не равны 1, то код не будет закрывать ордера).

с уважением

Младен

increase:
Привет Mladen, спасибо за помощь, я применил ваши изменения, но это действительно не работает, возможно было бы проще, если бы советник просто игнорировал все существующие открытые сделки, т.е. просто оставлял их открытыми, а затем открывал и закрывал свою собственную новую сделку В настоящее время он открывает и закрывает свою собственную сделку, но он также закрывает все дополнительные существующие открытые сделки
 
mladen:
увеличить

Из частичного кода вот что я могу предложить. Если создан булевский параметр NoCloses, и если этот параметр установлен в true, он не должен закрывать ордера, если его применить как в данном фрагменте (если CB и CS не равны 1, то код не будет закрывать ордера).

с уважением,

Mladen

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

 

Да. Это правильно.

Насколько я понял, это была ваша идея: позволить советнику открывать ордера, а затем вы будете управлять ордерами (закрывать их) вручную. С помощью этого параметра вы можете даже переключить его обратно на false, и тогда советник возобновит закрытие ордеров - таким образом, это "управляемо извне", как бы говоря.

increase:
Это верно, но если я не понял, это означает, что сделка, открытая советником, также никогда не закроется, и он просто будет переключаться между покупкой и продажей?
 
mladen:
Да. Это правильно Насколько я понял, это была ваша идея: позволить советнику открывать ордера, а затем вы будете управлять ордерами (закрывать их) вручную. С помощью этого параметра вы можете даже переключить его обратно на false, и тогда советник возобновит закрытие ордеров - таким образом, он "управляем извне", как бы говоря.

Извините, я выразился двусмысленно, я хочу, чтобы советник открывал и закрывал свой ордер и игнорировал все существующие ордера, так например

1. У меня открыто 5 ордеров на продажу

2. Я применяю советника, он открывает 1 ордер на покупку

3. Теперь у меня 5 ордеров на продажу и 1 на покупку

4. Теперь советник срабатывает на продажу, поэтому он закрывает свой ордер на покупку.

5. Теперь у меня 6 ордеров на продажу (5 существующих, 1 ордер советника на продажу).

6. Теперь советник срабатывает на покупку, поэтому он закрывает свой ордер на продажу.

7. Теперь у меня 5 ордеров на продажу и 1 на покупку и т.д.

Я закрою существующие продажи, советник игнорирует любые другие сделки, кроме своих собственных, как указано выше.

 

увеличить

Он уже делает это, если вы установите параметр Magic в значение, отличное от 0 (это часть кода, которая проверяет, должен ли он закрыть ордер на покупку непосредственно перед ордером на закрытие).

if(OrderType()==OP_BUY&&OrderSymbol()==Symbol()&&( (OrderMagicNumber()==Magic)||Magic==0))

Таким образом, если"Magic" не равен 0 и при условии, что значение для Magic уникально, он будет закрывать только ордера, открытые им самим

increase:
Извините, я был двусмыслен, я хочу, чтобы советник открывал и закрывал свой ордер и игнорировал все существующие ордера, например

1. У меня открыто 5 ордеров на продажу

2. Я применяю советника, он открывает 1 ордер на покупку

3. Теперь у меня 5 ордеров на продажу и 1 на покупку

4. Теперь советник срабатывает на продажу, поэтому он закрывает свой ордер на покупку.

5. Теперь у меня 6 ордеров на продажу (5 существующих, 1 ордер советника на продажу).

6. Теперь советник срабатывает на покупку, поэтому он закрывает свой ордер на продажу.

7. Теперь у меня 5 ордеров на продажу и 1 на покупку и т.д.

Я закрою существующие продажи, советник игнорирует любые другие сделки, кроме своих собственных, как указано выше.
 

Торговля OncePerBar для определенного таймфрейма

Здравствуйте, уважаемые fEllA's!

У меня есть советник (даааа, у кого не бывает), который прекрасно работает на тестере, совершает несколько сделок на каждом баре 4H, согласно инструкции. Теперь, при тестировании на демо (Alpari UK) с 11 парами, советник берет только 1 сделку, в то время как должен брать больше (3 максимум, согласно инструкции). Только каждый 4H бар, если условия выполнены.

У меня есть функция 'Semaphor' с GlobalVariable, и этот кусок кода, чтобы предотвратить открытие нескольких ордеров в пределах одного предопределенного таймфрейма (4H в данном случае):

//Покупка

if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount))))))

{

if (SignalsOnly)

{

// ------ Алерт должен быть только один раз на сигнал ИЛИ раз в 15 или 30 минут.

if (CheckAlertTime == iTime (NULL, 5, 0)) return(0);

else CheckAlertTime = iTime (NULL, 5, 0);

if (Alerts) Alert (Symbol() + " " + DoubleToStr (Ask, Digits) + " Сигнал ПОКУПКИ");

if (PlaySounds) PlaySound (WhichSound);

}

if (!IsTrade && !SignalsOnly)

{

if (CheckAlertTime == iTime (NULL, OncePerBarTF, 0)) return (0);

else CheckAlertTime = iTime (NULL, OncePerBarTF, 0);

//Проверка свободной маржи

if (AccountFreeMargin() < (1000 * Lots))

{

Print ("У нас нет денег. Свободная маржа = ", AccountFreeMargin());

return(0);

}

if (UseTakeProfit && CloseLotsPercent == 100) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0;

{

if (MoneyManagement) Lots = NormalizeDouble ((AccountFreeMargin() * Risk / 100 / ((Ask - BuySL) / Point / TickValue)), 2);

else Lots = Lots;

}

if (TradeIsBusy() && IsTradingAllowed() < 0)

return (-1);

RefreshRates();

Ticket = OrderSend (Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "7Qi BUY " + MagicNo, MagicNo, 0, DodgerBlue);

if (Ticket > 0)

{

if (OrderSelect (Ticket, SELECT_BY_TICKET, MODE_TRADES))

{

Print ("7Qi BUY opened: ", OrderOpenPrice());

if (Alerts) Alert (Symbol() + " " + DoubleToStr (Ask, Digits) + " Открыта покупка");

if (PlaySounds) PlaySound (WhichSound);

}

else

{

Print ("Ошибка открытия BUY: ", Err);

}

}

// TradedThisBar = Bars;

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

TradeIsNotBusy();

return (0);

}

}

//-------------------------------------------------

Возможно ли, что этот код:

if (CheckAlertTime == iTime (NULL, OncePerBarTF, 0)) return (0);

else CheckAlertTime = iTime (NULL, OncePerBarTF, 0);

не позволяет советнику торговать в середине часа? Проверяет ли он только в начале бара?

Если я использую функцию "TradedThisBar = Bars", мне придется оставить советника только на 1 таймфрейме, правильно?

Функция 'Semaphor' закодирована в TrailingStops тоже, PartialCloseLots тоже.

Спасибо всем за помощь,

Удачи,

Саймон

Словения

 

Iiiiiik - Я нашел проблему

Привет!

Я нашел проблему - скорее всего это комбинация:

if (TradeIsBusy() /*&& IsTradingAllowed()*/ < 0)

return (-1);

//-----------------------------------------------------------------------------------------

int IsTradingAllowed (int MaxWaitingSec = 30)

{

if (!IsTradeAllowed())

{

int StartWaitingTime = GetTickCount();

Print ("Торговый контекст занят! Подождите, пока он освободится...");

if (Alerts) Alert (Symbol() + " Торговля советником запрещена! Ожидание...");

while (true)

{

if (IsStopped())

{

Print ("Советник был остановлен!");

return(-1);

}

if (GetTickCount() - StartWaitingTime > MaxWaitingSec * 1000 )

{

Print( "Превышен лимит ожидания (" + MaxWaitingSec + " сек)!" );

return(-2);

}

if (IsTradeAllowed())

{

Print ("Торговый контекст теперь свободен!");

return(0);

}

Sleep (100);

}

}

else

{

Print ("Торговый контекст свободен!");

return(1);

}

}

*/

//-----------------------------------------------

int TradeIsBusy (int MaxWaitingSec = 30)

{

if (IsTesting()) return(1);

int Err = 0, StartWaitingTime = GetTickCount();

while (true)

{

if (IsStopped())

{

Print ("Советник был остановлен!");

return(-1);

}

if (GetTickCount() - StartWaitingTime > MaxWaitingSec * 1000)

{

Print ("Время ожидания (" + MaxWaitingSec + " сек) превышено!");

if (Alerts) Alert (Symbol() + " Время ожидания эксперта превышено!");

return(-2);

}

if (GlobalVariableCheck ("TradeIsBusy"))

break;

else

{

Err = GetLastError();

if (Err != 0)

{

Print ("TradeIsBusy - GlobalVariableCheck - Error # ", Err);

Sleep (100);

continue;

}

}

if (GlobalVariableSet ("TradeIsBusy", 1.0) > 0) return(1);

else

{

Err = GetLastError();

if (Err != 0)

{

Print ("TradeIsBusy - GlobalVariableSet - Error # ", Err);

Sleep(100);

continue;

}

}

}

while (true)

{

if (IsStopped())

{

Print ("Советник был остановлен!");

return(-1);

}

if (GetTickCount() - StartWaitingTime > MaxWaitingSec * 1000)

{

Print ("Время ожидания (" + MaxWaitingSec + " сек) превышено!");

if (Alerts) Alert (Symbol() + " время ожидания превышено!");

return (-2);

}

if (GlobalVariableSetOnCondition ("TradeIsBusy", 1.0, 0.0 )) return (1);

else

{

Err = GetLastError();

if (Err != 0)

{

Print ("TradeIsBusy - GlobalVariableSetOnCondition - Error # ", Err);

continue;

}

}

if (Alerts) Alert (Symbol() + " - ожидание завершения торговли другим советником...");

Sleep (1000);

}

}

//--------------------------------

void TradeIsNotBusy()

{

int Err;

if (IsTesting())

{

return(0);

}

while (true)

{

if (IsStopped())

{

Print (Symbol() + " Советник был остановлен!" );

return(-1);

}

if (GlobalVariableSet ("TradeIsBusy", 0.0) > 0) return(1);

else

{

Err = GetLastError();

if (Err != 0)

Print ("TradeIsNotBusy - GlobalVariableSet - Error # ", Err);

}

Sleep (100);

}

}

//-----------------------------------------------------------------------------------------------

Я попробую без функции IsTradeAllowed.

В любом случае спасибо,

Удачи,

Саймон

 

код ошибки 130

----- удалено ----- больше не нужно......

 

Загружаемый учебник по mq4

Привет, ребята,

не могу найти учебник или справочник (не онлайн !!) по коду mq4.

Не могли бы вы мне помочь?

с наилучшими пожеланиями

Решено, пришлось распаковать файл с помощью утилиты.