[АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 3. - страница 589

 
ilunga:
Потому что это локальные переменные, которые уже на втором тике хранят мусор вместо ticket

Огромное спасибо! Честно все время думал об этом!
 
Roman.:


См. прицеп. Размещаете его содержимое в папку Experts терминала. Выбираете таймфрейм интересующего Вас торгуемого инструмента, бросаете на его график сОва,

при этом задаете параметры для открытия ордера во внешних переменных эксперта:

Далее ждете образование нового бара на выбранном Вами таймфрейме инструмента...

При открытии ордера с рынка экспертом сравниваете время его открытия и время открытия нового бара.

Роман, как обещал рассказываю, что получается в реальности при работе с советником "открытие на открытии". Во первых советник срабатывает сразу на следующем тике после размещения на 1-часовом графике, а на открытии следующей свечи он открывает уже вторую сделку. Почему, я пока понять не могу. Во вторых цена открытия сделки все-таки не совпадает с ценой открытия новой свечи:

2012.02.24,12:00,1.3392,1.3405,1.3383,1.3387,768 - свеча открывается по 1,3392, а ордер срабатывает по 1.3390. В настройках я указываю проскальзывание в 1 пункт. Если указать 0 пунктов, то советник вообще не сработает, правильно я понимаю?

Лог я приложил. Для меня все таки остается важным что ордер на открытие совпадал с ценой открытия свечи.

 

Здравствуйте, господа. Буду признателен за пояснение.

Верно ли я понимаю, что если в коде последовательно записаны команды OrderDelete и OrderSend и если советник получает сигнал на исполнение обеих команд (снятие + установка) на тике №1, то:

- эти две команды не могут быть исполнены на одном и том же тике №1, а их исполнение растягивается минимум на 3 тика, причем

- на тике №1 подается команда OrderDelete;

- после подачи OrderDelete только со следующим тиком №2 возвращается результат, и только теперь на этом же тике №2 может быть подана команда OrderSend;

- результат команды OrderSend будет известен только на тике №3.

Так ли это?


И верно ли утверждение, что возможности на одном и том же тике отсылать две команды в МТ нет?

Советник пишу на МТ4.

Благодарю.

 
Les:

Здравствуйте, господа. Буду признателен за пояснение.

Верно ли я понимаю, что если в коде последовательно записаны команды OrderDelete и OrderSend и если советник получает сигнал на исполнение обеих команд (снятие + установка) на тике №1, то:

- эти две команды не могут быть исполнены на одном и том же тике №1, а их исполнение растягивается минимум на 3 тика, причем

- на тике №1 подается команда OrderDelete;

- после подачи OrderDelete только со следующим тиком №2 возвращается результат, и только теперь на этом же тике №2 может быть подана команда OrderSend;

- результат команды OrderSend будет известен только на тике №3.

Так ли это?


И верно ли утверждение, что возможности на одном и том же тике отсылать две команды в МТ нет?

Советник пишу на МТ4.

Благодарю.

тик - это новая котировка. И связи со временем выполнения команд OrderDelete и OrderSend нету

если идут новости, да + проскальзывания, то пока у вас простой OrderSend выполняется пройдет с десяток тиков. А если на рынке ночной флет, то за один тик обе команды пройти могут успеть

 
Les:

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


Также возможна коллизия, когда, например, у одного ордера срабатывает стоплосс, а другой вы пытаетесь открыть/закрыть советником на том же тике. Тогда сервер может в ряде случаев не дать исполнить операцию.


Т.е. ответ на ваши вопросы - нет, это не так))

 
ilunga:

тик - это новая котировка. И связи со временем выполнения команд OrderDelete и OrderSend нету

если идут новости, да + проскальзывания, то пока у вас простой OrderSend выполняется пройдет с десяток тиков. А если на рынке ночной флет, то за один тик обе команды пройти могут успеть

МТ, насколько я понимаю, тянет информацию с сервера потиково (а сервер, в свою очередь, дает ответы по командам одновременно с отсылкой новых тиков, это оптимизирует расходы по времени). И раньше, чем придет новый тик, ничего не известно. Я это имел ввиду. Но, может, я ошибаюсь в этом предположении? Вопрос связан скорее не с десятком тиков, а со вторым указанным Вами вариантом, когда тик медленный.

Верно ли я Вас понял, таким образом, что получение отклика по команде №1 не является обязательным условием, чтобы перейти к команде №2 и полностью ее обработать?

Отклик по команде - это "несущественная" часть команды? Его наличие не критично, чтобы перейти к следующей команде?

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


Спасибо.

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


Также возможна коллизия, когда, например, у одного ордера срабатывает стоплосс, а другой вы пытаетесь открыть/закрыть советником на том же тике. Тогда сервер может в ряде случаев не дать исполнить операцию.


Т.е. ответ на ваши вопросы - нет, это не так))

Как это не так, если получается, что как раз "так", по Вашим же словам? )) Или я чего-то опять не понял? Вы пишете мне в ответ, что функции исполняются так, что следующий оператор исполняется только после отработки кода ошибки предыдущего. Я, мне кажется, это и предполагал: что "две команды не могут быть исполнены на одном и том же тике №1", потому что отклик - тот самый ответ или код ошибки - появляется самое раннее с новым тиком. Или нет? Или отклики по командам идут отдельным по времени потоком, не связанным с потоком котировок? Возможно, моя ошибка в том, что я предположил, что результаты исполнения команд возвращаются с новой котировкой?

Конечно, я имел ввиду в первую очередь ситуацию, когда тики медленные.

 
Скажите, пожалуйста, можно-ли сделать так, чтобы советник закрывал только положительные сделки, несмотря на сигнал индикатора о закрытии сделки и закрывать их при следующих сигналах индикатора, по мере их выхода в профит?
 
Les:

МТ, насколько я понимаю, тянет информацию с сервера потиково (а сервер, в свою очередь, дает ответы по командам одновременно с отсылкой новых тиков, это оптимизирует расходы по времени). И раньше, чем придет новый тик, ничего не известно. Я это имел ввиду. Но, может, я ошибаюсь в этом предположении? Вопрос связан скорее не с десятком тиков, а со вторым указанным Вами вариантом, когда тик медленный.

Верно ли я Вас понял, таким образом, что получение отклика по команде №1 не является обязательным условием, чтобы перейти к команде №2 и полностью ее обработать?

Отклик по команде - это "несущественная" часть команды? Его наличие не критично, чтобы перейти к следующей команде?

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


Спасибо.

Отклики на команду и тики идут отдельно и не связаны. Если мертвый флет, то вы можете "успеть" открыть/закрыть несколько ордеров на одном тике.
 

Здравствуйте. Я абсолютно не силен в программировании. Поэтому прошу помощи - помогите добавить в код закрытие позиций поStopLoss-у и TrailingStop-у . Советник не мой, но стратегия не плохая, поэтому методом проб и ошибок переделываю советника под себя - и уже честно говоря башню сносит, да еще и времени мало - работа. Кому интересно выкладываю советника полностью так сказать в оригинальной упаковке. А вот то, что я с ним творю :


//+------------------------------------------------------------------+
//|                                             stohastic_system.mq4 |
//|                                                    Анатолий      |                                                                  |
//+------------------------------------------------------------------+

extern double Lots=0.4;
extern int TakeProfit=50;
extern int NWave=2;
extern int K=9;
extern int D=3;
extern int slowing=5;
extern int Average_method=2;
extern int price_field=0;

int K_level=0;
int down=0;
int up=0;


int init()
  {

   return(0);
  }

int deinit()
  {

   return(0);
  }

int start()
  {
    int ticket=0;
    double stoch_1=iStochastic(NULL,0,K,D,slowing,Average_method,price_field,MODE_MAIN,1);
    double stoch_2=iStochastic(NULL,0,K,D,slowing,Average_method,price_field,MODE_MAIN,2);
    double stoch_3=iStochastic(NULL,0,K,D,slowing,Average_method,price_field,MODE_MAIN,3);
    int Hour_curr=TimeHour(TimeCurrent());
    
    if ((stoch_1>90)&&(stoch_2>70)) K_level=90;
    if ((stoch_1<10)&&(stoch_2<30)) K_level=10;  
    if(OrdersTotal()<1)
      {        
        if((Hour_curr>=1)&&(Hour_curr<24))//проверка сигналов только в этот промежуток времени
          {
            if((K_level==10)&&(stoch_1>10))//сигнал на покупку
              {
                RefreshRates();
                Print("Сигнал на покупку. stoch_1=",stoch_1," stoch_2=",stoch_2);
                ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,10,0,Ask+TakeProfit*Point,"buy_order1",1,0,Blue);
                
                K_level=10; 
                down=0;               
              }
            if((K_level==90)&&(stoch_1<90))//сигнал на продажу
              {
                RefreshRates();
                Print("Сигнал на продажу. stoch_1=",stoch_1," stoch_2=",stoch_2);
                ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,10,0,Ask-TakeProfit*Point,"sell_order1",1,0,Red);
               
                K_level=90;
                up=0; 
              }
          }
      }
    
   
   
    return(0);
  }
   
Файлы: