Что тут не так? - страница 5

 
sss2019:


Ух ты спасибо, я думаю этот способ более универсальный.

Кстати, а как объявить в советнике что ордер был открыт, OrderSend как я понял передает только тикет ордера. Может быть это реализовать с помощью OrderSelect, получится?


Перед блоком инициализации объявляем переменную, которая будет нести в себе тикет ордера. Например:

int Ticket;

В функции start () перед вызовом OrderSend() пишем:

Ticket=-1;

Поскольку функция OrderSend() возвращает тикет ордера, то далее проверяем, если переменная Ticket больше нуля, значит ордер был установлен. В противном случае ордера нет - смотрите справку по OrderSend - там написано, что если ордер установить не удалось, то функция вернёт не тике, п величину = (-1) . На следующем тике, поскольку сначала переменная инициализируется величиной = -1 и при этом ордер уже не ставится, то переменная до конца кода останется отрицательной. И так до тех пор, пока ни встанет новый ордер.

 
Покажите пожалуйста на примере, а то у меня совсем как то туго.
 
sss2019:
Покажите пожалуйста на примере, а то у меня совсем как то туго.
#property copyright ""
#property link      ""

int Ticket;
//+------------------------------------------------------------------+
//|                  Блок инициализации                              |
//+------------------------------------------------------------------+
int init(){
        return(0);
}
//+------------------------------------------------------------------+
//|                  Блок деинициализации                            |
//+------------------------------------------------------------------+
int deinit(){
        return(0);
}
//+------------------------------------------------------------------+
//|                  Старт работы советника                          |
//+------------------------------------------------------------------+
int start(){
        Ticket=(-1);
        
        if(если есть торговый сигнал){
                Ticket=OrderSend();
        }
        if(Ticket>0){// тикет более нуля - ордер встал
                // выполняем какие-то действия
        }
        return(0);
}
//+------------------------------------------------------------------+
//|                  Пользовательские подпрограммы                   |
//+------------------------------------------------------------------+
 

А почему значение переменной Ticket=(-1); в скобках?

Ну что за ерунда получилась, ордер открыт, а тикет все равно равен -1.

//+------------------------------------------------------------------+
//|                                                         Test.mq4 |
//|                      Copyright © 2011, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern int MaFastPeriod = 30;
extern int MaSlowPeriod = 90;
extern int StopLoss = 25;
extern int TakeProfit = 50;

int Ticket;
int init()
  {

  }



int deinit()
  {

  }

int start()
  {
  Ticket=(-1);
  double MyPoint = Point;
   if(Digits == 3 || Digits == 5)
      {
      MyPoint = Point * 10;
      }
      
double MaFast0 = iMA(Symbol(),0,MaFastPeriod,0,MODE_EMA,PRICE_CLOSE,0);
double MaSlow0 = iMA(Symbol(),0,MaSlowPeriod,0,MODE_EMA,PRICE_CLOSE,0);
   
   if(OrdersTotal() == 0 && MaFast0 > MaSlow0 && Ticket==(-1))
      {
      Ticket=OrderSend(Symbol(),0,0.1,Ask,30,Ask-StopLoss*MyPoint,Ask+TakeProfit*MyPoint,"CommentA",0,0,Green);
      return(Ticket);
      }
  Alert("Ticket = ",Ticket); 
   return(0);
  }
 
Зачем Вы пишете Так программа дальше не идет, и алерт Вам не выведет
return(Ticket);?
 
Получается, что окошко алерт вылезет только в случае, если сигнала на открытие позиции вообще не было, и обязательно выведет -1
 
Так значит после того как ордер присвоил переменной Ticket свое число не нужно выводить его с помощью return, переменная не удалится далее на следующем тике?
 

Скажите а можно ли одновременно открывать сразу несколько ордеров? Например так

if(условие выполнено)
{
OrderSend()
OrderSend()
OrderSend()
}
 
sss2019:

Скажите а можно ли одновременно открывать сразу несколько ордеров? Например так

Конкретно так может не получится, первый запрос будет обрабатываться сервером и для последующих будет ошибка торговый поток занят. Лучше использовать свой ордерсенд с обработкой ошибок.
 
sss2019:

Скажите а можно ли одновременно открывать сразу несколько ордеров? Например так


Одновременно - нельзя.

Только последовательно.

Причина обращения: