Взаимодействие Советников - страница 3

 
BoraBo >>:


1. Открывайте скриптом. Вот вам и комменты и стопы и магики.

2. Поставте проверку открытых ордеров в советнике с вопросом добавить ли этот ордер для работы.

3. Нарисуйте плакат "НЕ ЗАБУДЬ !!!! РЫНОК НЕ ПРОЩАЕТ !!!!!" ;)

Открывать ордера скриптом вполне возможно, но если нет более простого (и надежного) решения.

 
wise >>:

Думаю, тут главное -- чтобы второй действительно обломался, а не продолжал упорно пытаться выставить SL и TP такие же, как уже выставлено. Да и то, не уверен, что попытки установить SL/TP на такие же не будут отфильтрованы терминалом, думаю, будут. То есть, ДЦ об этом даже и не узнает.


Итого, перый установил, второй обломался. Если вдруг получилось, что первый установил, но второй еще не увидел и тоже пытается установить, то это будет всего один раз на позицию и то не всегда. Если ДЦ на основании этого начнет щемить -- ноги в руки и нафиг из такого ДЦ.


А вот если более сложная работа с ордерами (полный спектр возможных фунцкций), то, да, надо выставлять блокировки, например, отложкой по нереальной цене и очень аккуратно описать все возможные ситуации (одновременная установка, установил и умер, не установил и умер и т.д.)

Советник находит все открытые ордера и если в момент проверки он видит ордер с нулевым СЛ => ставит для него СЛ, если нулевой ТП => ТП. Нет цикла для СЛ (или ТП) заставляющего биться до победного - отправил сигнал, ждет 2 секунды потом если СЛ установлен выдаёт Алерт, а если нет - все повторяется сначала.


// ``` ````````````````````````````````````````````````````````````````````````````````````````````````````````````````````
// CALCULATION OF OPEN ORDERS FOR THE CURRENT CURRENCY PAIR
   int OrdersTotalMine = 0;

   if(OrdersTotal()>0) {
      for(int orders=0; orders<OrdersTotal(); orders++) {
         OrderSelect(orders, SELECT_BY_POS);
         if(OrderSymbol()==Symbol()) {
            OrdersTotalMine = OrdersTotalMine+1;
         } // if(OrderSymbol()==Symbol()) {
      } // for(int orders=0; orders<OrdersTotal(); orders++) {
   } // if(OrdersTotal()>0) {
// ``` ````````````````````````````````````````````````````````````````````````````````````````````````````````````````````



// ``` ````````````````````````````````````````````````````````````````````````````````````````````````````````````````````
if(OrdersTotalMine!=0) {

// CHECK FOR OPEN BUY ORDERS
   for(cnt=0; cnt<OrdersTotal(); cnt++) {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      OrderBuyExists = false;
      if((OrderType()==OP_BUY || OrderType()==OP_BUYSTOP)   &&   OrderSymbol()==Symbol()) {
         OrderBuyExists = true;
         break;
      }
   } // for(cnt=0; cnt<OrdersTotal(); cnt++)
// ````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````

// ````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````
// CHECK FOR OPEN SELL ORDERS
   for(cnt=0; cnt<OrdersTotal(); cnt++) {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      OrderSellExists = false;
      if((OrderType()==OP_SELL || OrderType()==OP_SELLSTOP)   &&   OrderSymbol()==Symbol()) {
         OrderSellExists = true;
         break;
      }
   } // for(cnt=0; cnt<OrdersTotal(); cnt++)
// ````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````

} // if(OrdersTotalMine!=0) {
// ``` ````````````````````````````````````````````````````````````````````````````````````````````````````````````````````





// ``` ````````````````````````````````````````````````````````````````````````````````````````````````````````````````````
// IF THERE NO OPEN ORDERS (AT ALL)
if(OrdersTotalMine==0) {
   OrderBuyExists  = false;
   OrderSellExists = false;
}
// ``` ````````````````````````````````````````````````````````````````````````````````````````````````````````````````````




// ``` ````````````````````````````````````````````````````````````````````````````````````````````````````````````````````
// AUTOMATIC Stop-Loss set to StopLossHARDLimit for OPEN ORDERS if THEY DON'T HAVE any SL set

if(OrdersTotalMine!=0) {
   if(RunInitialStopLossMode==true){
      for(cnt=0; cnt<OrdersTotal(); cnt++) {
         OrderSelect(cnt, SELECT_BY_POS);
         Ticket=OrderTicket();

// BUY -----------------------------------------------------------------------------------------
         if(OrderType()==OP_BUY   &&   OrderSymbol()==Symbol()   &&   OrderStopLoss()<=0 ) {
            bool Ans_InitialSL_BUY = OrderModify(OrderTicket(),OrderOpenPrice(),Bid-PointX*StopLossHARDLimit,OrderTakeProfit(),0,Green);
            Sleep(Slippage*2000);

            if (Ans_InitialSL_BUY==true) {
               Alert ("SL StopLossHARDLimit = ", StopLossHARDLimit, " set for BUY: ", Symbol(), " ", Ticket, "   ++++++++++++++");
            }
         } // if(OrderType() == OP_BUY  &&  OrderSymbol()==Symbol() )
// EO BUY -----------------------------------------------------------------------------------------



// SELL -----------------------------------------------------------------------------------------
         if(OrderType()==OP_SELL   &&   OrderSymbol()==Symbol()   &&   OrderStopLoss()<=0 ) {
            bool Ans_InitialSL_SELL = OrderModify(OrderTicket(), OrderOpenPrice(), Ask+PointX*StopLossHARDLimit, OrderTakeProfit(), 0, Green);
            Sleep(Slippage*2000);

            if (Ans_InitialSL_SELL==true) {
               Alert ("SL StopLossHARDLimit = ", StopLossHARDLimit, " set for SELL: ", Symbol(), " ", Ticket, "   ++++++++++++++");
            }
         } // if(OrderType() == OP_SELL  &&  OrderSymbol()==Symbol() )
// EO SELL -----------------------------------------------------------------------------------------


      } // for(cnt=0; cnt<OrdersTotal(); cnt++)
   } // if(RunInitialStopLossMode==true){
} // AUTOMATIC Stop-Loss
// ``` ````````````````````````````````````````````````````````````````````````````````````````````````````````````````````
 

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

 
Roger >>:

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

Это то как я работаю сейчас :) Получается что если на одном компьютере я случайно не запретил работу Советником, то вторым компьютером (в другом месте) уже торговать нельзя.

 
chief2000 >>:

Открывать ордера скриптом вполне возможно, но если нет более простого (и надежного) решения.





Допишите советник для графического открытия ордеров, вполне нормально работает, единственный минус ордер отктрывается на следующем тике (не люблю зацыкленных советников). В принцыпе тот же скрипт, только ссзади.


ЗЫ По субъективным ощущениям работает даже быстрее, чем прямое открытие позиций.

 
Один счет - один советник, т.е.открыть еще один счет или текущий пополам.
 
chief2000 писал(а) >>

Это то как я работаю сейчас :) Получается что если на одном компьютере я случайно не запретил работу Советником, то вторым компьютером (в другом месте) уже торговать нельзя.

Я поначалу думал TheExpert предложил то же что и я думал... Но оказалось иначе.

нельзя ли сделать так:

Эксперт 1 ищет отложку, если Magic совпадает с его Magic-ом, то он работает - Эксперт 1.

Эксперт 2 ищет отложку, если Magic совпадает с его Magic-ом, то он работает - Эксперт 2.

Если отложек нет, то никто не работает, или кому-нибудь приоритет отдать - на усмотрение пользователя...

Отложку которую ищут эксперты выставляет пользователь...

 
StatBars >>:

Я поначалу думал TheExpert предложил то же что и я думал... Но оказалось иначе.

нельзя ли сделать так:

Эксперт 1 ищет отложку, если Magic совпадает с его Magic-ом, то он работает - Эксперт 1.

Эксперт 2 ищет отложку, если Magic совпадает с его Magic-ом, то он работает - Эксперт 2.

Если отложек нет, то никто не работает, или кому-нибудь приоритет отдать - на усмотрение пользователя...

Отложку которую ищут эксперты выставляет пользователь...

Надо будет все обдумать на досуге. Как мне видится сейчас, решение должно быть не автоматическим, а полу-автоматическим - то что Вы предлагаете. Перед началом работы принудительно (вручную), удалить все отложенные ордера если таковые имеются и открыть новый (Например используя скрипт?), и потом уже "активный" Советник будет продолжать в обычном режиме. Можно сделать и дополнительную проверку - если ордер открыт более скажем 2 минут и все еще без СЛ и ТП, то тут уж любой Советник может вмешаться.

 
BoraBo >>:

Допишите советник для графического открытия ордеров, вполне нормально работает, единственный минус ордер отктрывается на следующем тике (не люблю зацыкленных советников). В принцыпе тот же скрипт, только ссзади.


ЗЫ По субъективным ощущениям работает даже быстрее, чем прямое открытие позиций.

Первая мысль - можно создавать горизонтальные линии, пересечение с которыми будет запускать Советник (покупка или продажа). Но это будут открытия по рынку. Вы работаете со Стоп-Ордерами?

 

Всем Большое Спасибо за помощь!