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

 

Да, действительно. Смотрел, да не увидел.

Спасибо.

Торможу сегодня. Надо отдыхать по выходным.

 
rid >>:

Вот так примерно -



Спасибо!!! буду юзать далее....

 


DDFedor



Rid



Спасибо.

 

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

 

Помогите. Хочу советник, который будет торговать ночью. Пишу код

int start()
{
string Symb;
Symb=Symbol();
string Vremya;
Vremya=TimeToStr(TimeLocal(),TIME_MINUTES);
if(Vremya > 23:00 || Vremya < 06:00 )
{
// тут торговые функции
}
}

Выдает ошибку

'||' - condition cannot be a string

Причем если условие сократить до

if(Vremya > 23:00

оно будет работать,

а если до

if(Vremya < 06:00 )

то не будет.


Я не пойму, что не так. Подскажите, как время задать?


 
morok >>:

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

Да, действительно.... 

В ф-и ОРДЕРСЕНД  я забыл задать магик.

Теперь все норм. работает. Проверил. В рынке могут быть не более двух разнонаправленных сделок либо не более одной однонаправленной.

Если надо не более одной сделки любого типа, то нужно в ф-ях NumberOfPositions(c) заменить тип сделки на -1 (минус единицу)

extern int   Magic = 777;
extern int       Ema1=14;
extern int       Ema2=48;
double Ema_1;
double Ema_2;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   //int Orders = OrdersTotal(); 
   Ema_1 =iMA(NULL, 0, Ema1, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   Ema_2 =iMA(NULL, 0, Ema2, 0,MODE_SMMA, PRICE_MEDIAN, 0);   
   int ticket;
//------------------------------------------------
 if (NumberOfPositions(NULL,OP_BUY,Magic)< 1 && Ema_1>Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_BUY,0.5,Ask,10,Ask-850*Point,Ask+550*Point,"kupil",Magic,0,Green);
    } 
//------------------------------------------------------
   if (NumberOfPositions(NULL,OP_SELL,Magic)< 1 && Ema_1<Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_SELL,0.5,Bid,10,Ask+850*Point,Bid-550*Point,"kupil",Magic,0,Violet);
    } 
//------------------------------------------------------
   return(0);
  }

//жжжжжжжжж Пользовательские функции жжжжжжж

int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++)                                    {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))      {
      if (OrderSymbol()==sy || sy=="")                   {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op)                   {
            if (mn<0 || OrderMagicNumber()==mn) kp++;
          }}}}}
  return(kp);
}




 
alderru >>:

Скажите, пожалуйста, что показывает функция iTime.

Что это за абра-кадабра из 10 цифр? Секунды?

Как бы их перевести в год-месяц-день-час-минута.

Вот так: задаёте сдвиг бара и получаете дату и время, по умолчанию полностью(если же time=1 или true то получаем только время).

Очень удобная функция, рекомендую.

string Times(int Sdvig, bool time=0)
{//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  string YAER   = TimeYear( Time[Sdvig]);
  string DAY    = TimeDay( Time[Sdvig]);
  string HOUR   = TimeHour( Time[Sdvig]);
  string MINUTE = TimeMinute( Time[Sdvig]);
  int month = TimeMonth( Time[Sdvig]);
  string MONTH;
  switch(month)
    {case 1: MONTH = "янв ";break;
     case 2: MONTH = "фев ";break;
     case 3: MONTH = "март";break;
     case 4: MONTH = "апр ";break;
     case 5: MONTH = "май ";break;
     case 6: MONTH = "июнь";break;
     case 7: MONTH = "июль";break;
     case 8: MONTH = "авг ";break;
     case 9: MONTH = "сен ";break;
     case 10: MONTH = "окт ";break;
     case 11: MONTH = "нояб";break;
     case 12: MONTH = "дек ";break;              
     default: MONTH = "----";break;
    }
 if(TimeHour( Time[Sdvig])<10) HOUR= "0"+HOUR;     
 if(MINUTE=="0")MINUTE="00";
 if(time)return(HOUR+":"+MINUTE);                   
 else return(YAER+"   "+MONTH+" "+DAY+"   "+HOUR+":"+MINUTE);
}//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 

rid Пасибо..Именно то что и искал) Подскажи если не трудно как мне теперь сделать чтоб он при открытии одного ордера крыл другой? попытался подстроить второй уровень if но не прокатило(

Вроде все логияно сделал а при тесте он открывает и кроет ордер сразу

extern int   Magic = 777;
extern int       Ema1=14;
extern int       Ema2=48;
extern int       Ema3=100;
double Ema_1;
double Ema_2;
double Ema_3;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   //int Orders = OrdersTotal(); 
   Ema_1 =iMA(NULL, 0, Ema1, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   Ema_2 =iMA(NULL, 0, Ema2, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   Ema_3 =iMA(NULL, 0, Ema3, 0,MODE_SMMA, PRICE_MEDIAN, 0);     
   int ticket;
//------------------------------------------------
 if (NumberOfPositions(NULL,OP_BUY,Magic)< 1 && Ema_1>Ema_2 && Ema_2>Ema_3) 
    {
      ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,10,0,0,"kupil",Magic,0,Green);
    } 
//------------------------------------------------------
   if (NumberOfPositions(NULL,OP_SELL,Magic)< 1 && Ema_1<Ema_2 && Ema_2<Ema_3) 
    {
      ticket=OrderSend(Symbol(),OP_SELL,0.1,Bid,10,0,0,"kupil",Magic,0,Violet);
    } 
//--------------------------------------------------------
 if (NumberOfPositions(NULL,OP_BUY,Magic)>= 1 && Ema_1<Ema_2) //--проверяю есть ли ордер BUY и крою его если линии ема пересеклись
    {
      ticket=OrderClose(OrderTicket(),0.1,Bid,300,Violet);
    } 
//------------------------------------------------------
 if (NumberOfPositions(NULL,OP_SELL,Magic)>= 1 && Ema_1>Ema_2) //--проверяю есть ли ордер SEll и крою его если линии ема пересеклись
    {
      ticket=OrderClose(OrderTicket(),0.1,Ask,300,Green);
    } 
//------------------------------------------------------
   return(0);
  }

//жжжжжжжжж Пользовательские функции жжжжжжж

int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++)                                    {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))      {
      if (OrderSymbol()==sy || sy=="")                   {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op)                   {
            if (mn<0 || OrderMagicNumber()==mn) kp++;
          }}}}}
  return(kp);
}
 
rid писал(а) >>

Понятно. Определить, были ли позиции на истории можно вот так:

Но тогда ваш код будет работать только в тестере. Т.к. вам иначе в онлайне придется при каждом включении советника менять магик.


Точно, именно то, что нужно!

Подскажите, как этот код корректно вставить в эту решетку:

(если ставлю напрямую – тестер просто останавливается на открытии первой позиции)

for (int i=0; i< OrdersTotal(); i++)                          {

    if (!(OrderSelect(i, SELECT_BY_POS,MODE_HISTORY ))) continue;

//выбираем из истории счета

    if (OrderSymbol() != Symbol()) continue;    

     if ( OrderMagicNumber()==Magic)                            {

              позиции = true;

                                                             }}



//Открытие позиции:



bool Open_Buy() {

   bool res=false; 

if(условие_1)      {

            if ( советник еще не открывал позиций с Магическим номером)    {

                    res=true;     }}

else    {

    if(условие_1)       { 

   if (условие_2 опирается на данные прошлого ордера)       { 

   res=true;     }}}

return(res);

}
 
morok >>:

rid Пасибо..Именно то что и искал) Подскажи если не трудно как мне теперь сделать чтоб он при открытии одного ордера крыл другой? попытался подстроить второй уровень if но не прокатило(

Вроде все логияно сделал а при тесте он открывает и кроет ордер сразу

С закрытием позиций я в свое время разбирался вот здесь -

https://www.mql5.com/ru/forum/105913

//==================Закрытие позиций ============================
 
//----------------------------------------------------------------------
  for (int v=0; v<OrdersTotal(); v++)                             {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()==Magic)      { 
//-----------------------------------------------------                  
if(OrderType()== OP_BUY) { // если открыта бай-позиция                                   
  if(вот здесь вставляй свои условия закрытия)  {
    OrderClose(OrderTicket(),OrderLots(),Bid,3,Вlack); // закрываем позицию
                                 }       
                               }  
 //--------------------------------------------------------
if(OrderType()== OP_SELL) { // если открыта селл-позиция 
 if(вот здесь вставляй свои условия закрытия)    {
   OrderClose(OrderTicket(),OrderLots(),Ask,3,Yellow); // закрываем позицию
                     }       
                   }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
//------------конец блока закрытия позиций-----------------

Этот блок  вставляй  внутри ф-и СТАРТ -можно в самом начале, сразу после расчета Ema_1,Ema_2,Ema_3
 И,  видимо, нужно сделать работу советника по ЦЕНАМ ОТКРЫТИЯ,  иначе пересечение МА будет  постоянно закрывать открывающиеся позиции на почти каждом тике.

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

Но ещё проще я уже написал, как сделать. Нужно вместо NumberOfPositions(NULL,OP_BUY,Magic) и вместо NumberOfPositions(NULL,OP_SELL,Magic) при открытии позиций задать просто 

NumberOfPositions(NULL,-1,Magic)

и тогда в рынке будет постоянно не более одной позиции. Без всяких блоков закрытия.

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