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

 

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

Спасибо.

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

[Deleted]  
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)

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