[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 1126

 
drknn:


Код не верный. Во-первых, если функция start() имеет тип int, то она должна возвращать целочисленное значение. У Вас ретурн возвращается только по условию. А если условие не выполнено, что тогда должна вернуть терминалу функция Старт?

Далее, Вы слишком усложнили проверку - сделать лучше так: делаем счётчик ордеров, открытых и закрытых сегодня. Если количесовт сегодняшних ордеров больше нуля, то не торгуем. В противном случае торг разрешён.

изменил int на void... не помогло

если честно, то до конца не понимаю, как сделать счётчик ордеров и при этом сохранить возможность включения/отключения опции разовой дневной торговли....

....подумал-подумал: попробую так

if(CalculateCurrentOrders(Symbol())==0 && Orders==0)

{

CheckForOpen();

if (WaitForNewDay) {Orders++;}

return;

}

Сброс счётчика:

if(WaitForNewDay)CheckForNewDay();

void CheckForNewDay()

{

tm=iTime(Symbol(),PERIOD_D1,0);

if (bt!=tm) {bt=tm; Orders=0;}

}

В общем, вернулся к тому от чего убегал )))

 
dzhini:

изменил int на void... не помогло

если честно, то до конца не понимаю, как сделать счётчик ордеров и при этом сохранить возможность включения/отключения опции разовой дневной торговли....

-------------

В общем, вернулся к тому от чего убегал )))

//+------------------------------------------------------------------+
//|                                                            0.mq4 |
//|                                          Copyright © 2010, Drknn |
//|                                                    drknn@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Drknn"
#property link      "drknn@mail.ru"

// ---------- Пользовательские переменные ----------------------------
extern int      MAGIC=0;//У ордеров открытых вручную MAGIC=0

// ------------ Вспомогательные переменные --------------------------
string    ExpertName="0";// имя советника
string    SMB;
bool      DobroTorga;

//+------------------------------------------------------------------+
//|                  Блок инициализации                              |
//+------------------------------------------------------------------+
int init(){

  SMB=Symbol();
  return(0);
}
//+------------------------------------------------------------------+
//|                  Блок деинициализации                            |
//+------------------------------------------------------------------+
int deinit(){
        if (!IsTesting()){
    Comment("");
    Print("Советник деинициализирован (выключен совсем)");
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Старт работы советника                          |
//+------------------------------------------------------------------+
int start(){
  if(!IsTradeAllowed()){
    Comment("Торговля запрещена в настройках терминала, либо торговый поток занят");
    Print("Торговля запрещена в настройках терминала, либо торговый поток занят");
    return(0);
  }
  DobroTorga=true;
  if(SchBuy(MAGIC)+SchSell(MAGIC)+HistSchBuy(MAGIC)+HistSchSell(MAGIC)>0){
    DobroTorga=false;
  }
  if(DobroTorga==true){
    // ---- добро торговать есть - ставим ордера ---------
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Пользовательские подпрограммы                   |
//+------------------------------------------------------------------+


// =================================================================================================
// ************************* Счётчики ордеров ******************************************************
// =================================================================================================

//=========== SchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int SchBuy(int MAGIC){
  int SchBuy=0;
  for (int i=OrdersTotal()-1;i>=0;i--) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
       Print("ОШибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!= SMB || OrderMagicNumber()!= MAGIC){ continue;}
      if(OrderType()==OP_BUY){ 
        SchBuy++;
      }  
    }
  }
  return(SchBuy);
}                  
//==================================================================================================


//=========== SchSell()  ===============================
//  Функция возвращает количество Sell-ордеров
//  SchSell  - счётчик Sell ордеров
//-----------------------------------------------------------
int SchSell(int MAGIC){
  int SchSell=0;
  for (int i=OrdersTotal()-1;i>=0;i--){
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
       Print("ОШибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!=SMB || OrderMagicNumber()!=MAGIC){ continue;} 
      if(OrderType()==OP_SELL){
        SchSell++;
      }
    }
  }
 return(SchSell);     
}                  
//==================================================================================================

//=========== HistSchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров сегодняшнего дня в истории
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int HistSchBuy(int MAGIC){
  int SchBuy=0;
  for (int i=OrdersHistoryTotal()-1;i>=0;i--) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
       Print("ОШибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!= SMB || OrderMagicNumber()!= MAGIC){ continue;}
      if(OrderType()==OP_BUY){ 
        if(OrderOpenTime()>=iTime(SMB,PERIOD_D1,0)){
          SchBuy++;
        }
      }  
    }
  }
  return(SchBuy);
}                  
//==================================================================================================


//=========== HistSchSell()  ===============================
//  Функция возвращает количество Sell-ордеров сегодняшнего дня в истории
//  SchSell  - счётчик Sell ордеров
//-----------------------------------------------------------
int HistSchSell(int MAGIC){
  int SchSell=0;
  for (int i=OrdersHistoryTotal()-1;i>=0;i--){
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
       Print("ОШибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!=SMB || OrderMagicNumber()!=MAGIC){ continue;} 
      if(OrderType()==OP_SELL){
        if(OrderOpenTime()>=iTime(SMB,PERIOD_D1,0)){
          SchSell++;
        }
      }
    }
  }
 return(SchSell);     
}                  
//==================================================================================================
 
Уважаемые форумчане помогите с кодом. Ситуация такая, вручную рисую и перемещаю горизонтальную линию и когда цена касается ее то должен срабатывть сигнал.
 
Alexandr24:
Уважаемые форумчане помогите с кодом. Ситуация такая, вручную рисую и перемещаю горизонтальную линию и когда цена касается ее то срабатывает сигнал.

Цена коснулась линии - возникает сигнал. Это понятно. А что с кодом-то не так?
 
drknn:


Вы сегодня за главного в этой теме ))) спасибо. буду разбираться
 
Извиняюсь, некорректно поставил задачу)) Нужен собственно код который делал бы такое.
 
Alexandr24:
Извиняюсь, некорректно поставил задачу)) Нужен собственно код который делал бы такое.


Первое, что Вам нужно понять, так это то, что линия - это объект. Программный код различает объекты по их именам. Вам нужно в коде прописать имя линии, а затем, когда Вы бросаете линию на график, нужно войти в её свойства и изменить имя на то, которое прописано в коде. Только в этом случае код поймёт, что обрабатывать нужно показания, снимаемые с этого объекта.

Далее в коде Вам нужно запросить цену, на которой стоит линия. Запрос осуществляется через функцию double ObjectGet(string name, int prop_id). Вместо name нужно указать имя Вашей линии, а вместо prop_id указать OBJPROP_PRICE1. Таким образом Вы можете программно получить цену, на которую установлена эта линия. Получить и внести это значение в переменную. далее в коде нужно организовать проверку на пердмет касания ценой этой линии. Например так: Если на предыдущем тике цена ниже того уровня, на котором стоит линия и при этом на текущем тике она больше или равна этому уровню, то произошло касание.

Александр, если у Вас не получается что-то с кодом, то здесь помогут. Если Вам нужно, чтоб код сделали вместо Вас - то Вам сюда https://www.mql5.com/ru/job.

 
int start()
  {
   int   i, counted_bars=IndicatorCounted();
//----

 double n=ObjectGet("n",OBJPROP_PRICE1); 
 if (Close[0]==n&&Close[0]!= 0)
 Alert(Symbol(),"  n  ",n);

//----
Comment(n);
   return(0);
  }
Сделал так, но сигнал не срабатывает почему то когда Close[0]==n. Как бы это исправить? Условия же соблюдены но почему то не работает.
 
Alexandr24:
Сделал так, но сигнал не срабатывает почему то когда Close[0]==n. Как бы это исправить?


Ну, судя по коду Вы сделали индикатор. И поэтому для проверки работоспособности этого участка кода, Вам придётся сидеть и ждать когда же очередной тик соизволит прикоснуться к линии. Лучше для отладки этого участка кода воспользоваться созданием скрипта - он даст результаты мгновенно.

Первое, в чём Вам нужно убедиться, так это в том, что код реально видит Вашу линию. Как это сделать? Нужно запросить её цену и вывести алертом на экран. Делаем.

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start(){
  string LineName="1";
  double MyLine=-100;
  MyLine=ObjectGet(LineName,OBJPROP_PRICE1);
  if(MyLine>0){
    Alert ("Горизонтальная линия ",LineName," установлена на уровень = ",MyLine);
  }
  else{
    Alert("Запрос значения линии ",LineName," вренул ошибку № ",GetLastError());
  }
  return(0);
}
//+------------------------------------------------------------------+

Теперь, когда скрипт перекомпилирован, открываем любой график и кидаем на него горизонтальную линию. Затем входим в её свойства и поскольку в коде мы присвоили линии имя "1", то и в свойствах линиии ставим это имя:

Жмём ОК. Бросаем скрипт на график и убеждаемся в том, что цену алерт нам вернул правильную. Перемещаем линию по графику в другое место и снова кидаем скрипт на график - убеждаемся, что если руками поменять положение линии, то наш код её всё равно видит и распознаёт.

Ну дальше в таком же духе.

 

Индикатор тестирую через тестер с включенной визуализацией. Немного исправил код так как для срабатывания алерта нужна нормализация значений. Но если переставлять линию на текущем баре скажем часовике тогда алерт сработает только 1 раз при последующих перемещениях линии по текущему бару алерт почему то неработает. Приходится ждать другого бара.

int start()
  {
   int   i, counted_bars=IndicatorCounted();
//----
double b=NormalizeDouble((Close[0]),Digits);
 double n=NormalizeDouble(ObjectGet("n",OBJPROP_PRICE1),Digits); 
 if (b==n&&b!= 0)
 Alert(Symbol(),"  n  ",n);

//----
Comment(n);
   return(0);
  }
Причина обращения: