[Архив!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 2. - страница 476

 
Если надо то и jma выкладываю. Надо название индикатора изменить на JMA[i]
Файлы:
jmaxvib.mq4  11 kb
 
for(i = 0; i < limit; i++)
     {
       if(dBuffer[i+1]>80 && dBuffer[i]<80) DN[i] = 70; Fd=-1; Fu=0;               //пересекла 80   --> 1
       if(dBuffer[i+1]<20 && dBuffer[i]>20) UP[i] = 30; Fu=1;  Fd=0;               //пересекла 20   --> 1
       
       if(dBuffer[i+1]>rsi[i+1] && dBuffer[i]<rsi[i]) dn[i] = 60; fd=-1; fu=0;     //пересечение двух  -->  2
       if(dBuffer[i+1]<rsi[i+1] && dBuffer[i]>rsi[i]) up[i] = 40; fu=1;  fd=0;     //пересечение двух     -->  2
       
       if(Fd==-1 && fd==-1) dot[i]=90; Fd=0; Fu=0; fd=0; fu=0;
       if(Fu==1 && fu==1)   dot[i]=10; Fd=0; Fu=0; fd=0; fu=0;

У вас идет перебор баров из текущего времени в прошлое.

Перебор в массиве идет до последнего.

Поэтому все переменный будут давать значения для последнего случая (в данном случае -- давнего).

Поэтому нужно сделать перебор из прошлого в настоящее.

for(i = limit; i >= 0; i--)
И переменные
int fd, fu,Fd, Fu;

объявить на верхнем уровне, т.е перед Стартом и Инитом.

Причем в Старте обнулять их не нужно. Обнуление оставить только в том месте где у вас они обнуляются

if(Fd==-1 && fd==-1) dot[i]=90; Fd=0; Fu=0; fd=0; fu=0;
       if(Fu==1 && fu==1)   dot[i]=10; Fd=0; Fu=0; fd=0; fu=0;
 
rlx Спасибо, Вце заработало.
 
PapaYozh:


Во-первых, там 2 раза встречается OrderSend() и оба раза вне указанного Вами условия.

Во-вторых, в OrderSend() передается ненормализованная цена.

В-третьих, анализируйте возвращаемый функцией OrderSend() результат, пишите в журнал сообщения в случае возникновения ошибок при открытии/модификации/закрытии ордера и анализируйте журнал.


Может кто нибудь исправленную версию советника Experrement 1 выложить?
 

Добрый день!

Благодарю, за ответы - Вы очень помогли )))

Ребята! Советник заключает сделки при пересечении двух мувингов. И когда они пересекаются обратно, он закрывает сделки и открывает в противоположном направлении, теряя прибыль.

1. Как написать по условию, что бы он закрывал сделки, когда линии только начинают сходиться, сближаться? И что бы он не открывал новую сделку в том же направлении, а ждал когда они пересекутся в противоположную сторону?

2. Или закрытие сделок, когда эр си ай пересекает уровень 80 сверху вниз на бай, и уровень 20 внизу вверх при сэл. И при закрытии сделки, когда условия выполняются, он не открывал сделку в туже сторону, а ждал когда они пересекутся в обратную сторону?

Если есть какие-то похожие темы на форуме, прошу дать ссылку!

Заранее благодарен!

Удачной торговли!

Прибыльных сделок!

 

Всем привет!

Подскажите, что сие означает:

Order buy ...... failed [Trade timeout]

Конкретно интересует что это за таймаут

 
smartemiy:

Добрый день!

Благодарю, за ответы - Вы очень помогли )))

Ребята! Советник заключает сделки при пересечении двух мувингов. И когда они пересекаются обратно, он закрывает сделки и открывает в противоположном направлении, теряя прибыль.

1. Как написать по условию, что бы он закрывал сделки, когда линии только начинают сходиться, сближаться? И что бы он не открывал новую сделку в том же направлении, а ждал когда они пересекутся в противоположную сторону?

2. Или закрытие сделок, когда эр си ай пересекает уровень 80 сверху вниз на бай, и уровень 20 внизу вверх при сэл. И при закрытии сделки, когда условия выполняются, он не открывал сделку в туже сторону, а ждал когда они пересекутся в обратную сторону?

Если есть какие-то похожие темы на форуме, прошу дать ссылку!

Заранее благодарен!

Удачной торговли!

Прибыльных сделок!


по ссылке https://www.mql5.com/ru/code похожих целый склад
 
Еще вопрос: какой функцией можно вытащить стоимость одного пункта инструмента?
 
PapaYozh:


Во-первых, там 2 раза встречается OrderSend() и оба раза вне указанного Вами условия.

Не хочется быть занудой, однако..

if(OrdersTotal()>0&&tral>0&&OrderMagicNumber()==MAGIC&&(OrderType()==OP_SELL||OrderType()==OP_BUY)){
     if(ObjectFind(NamePrice)==-1)
      {
        ObjectCreate(NamePrice,OBJ_HLINE,0,0,Ask);
        ObjectSet(NamePrice,OBJPROP_COLOR,LineColor);
      }
      double n= ObjectGet( NamePrice, OBJPROP_PRICE1); 
      double p1= ObjectGet( NamePrice1, OBJPROP_PRICE1);
      double p2= ObjectGet( NamePrice2, OBJPROP_PRICE1);
//....................................................................... 
      double d= AccountEquity()-AccountBalance();                 
       if(ObjectFind(NamePrice1)==-1&&d>0)
      {       
        ObjectCreate(NamePrice1,OBJ_HLINE,0,0,n+d*Point*10);
        ObjectSet(NamePrice1,OBJPROP_COLOR,LineColor1);
      }
      if(n+d*Point*10>p1)ObjectSet(NamePrice1,OBJPROP_PRICE1,n+d*Point*10);
      if(ObjectFind(NamePrice2)==-1&&n+d*Point*10<p1)
      {       
        ObjectCreate(NamePrice2,OBJ_HLINE,0,0,n+d*Point*10);
        ObjectSet(NamePrice2,OBJPROP_COLOR,LineColor2);
      } 
      if(p2!=n+d*Point*10)ObjectSet(NamePrice2,OBJPROP_PRICE1,n+d*Point*10);  
      if(nb+ns==2&&tral<20&&p1-p2>=(p1-n)/tral&&p2>n&&p2-n>dohod*Point/10)CloseALL(); 
      if(nb+ns==2&&tral>20&&p1-p2>=tral*Point&&p2>n)CloseALL();  
      }
//..........................................................................
    if(ob==0||OrderOpenTime()<iTime(Symbol(),TF,0))
       { 
     
      if( R==1&&zb==0&&C1>O1&&iVolume(Symbol(),TF,0)<2)
         {
         if(ob==0||OrderOpenTime()<iTime(Symbol(),TF,0))
         {
         OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+dist*Point,3,0,0,"ko",MAGIC,TimeCurrent()+60*experation,Green);
         }
         }
      
      }
    if(os==0||OrderOpenTime()<iTime(Symbol(),TF,0))
        {      
      if(R==1&&zs==0&&C1<O1&&iVolume(Symbol(),TF,0)<2)
        {        
         if(os==0||OrderOpenTime()<iTime(Symbol(),TF,0))
         {
         OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-dist*Point,3,0,0,"ko",MAGIC,TimeCurrent()+60*experation,Red);
         }
         }
      return(0);
     }
   

   
  }

Объясните мне, как откроется ордер, если OrderTotal() равен нулю.

Спасибо.

 

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

например, советник сработал, открылся ордер (дальше не интересует), нужно чтобы ордер больше не открывался на текущем баре на часовом таймфрейме

все выглядит примерно так:

int hh;
int CurrentHour;
CurrentHour=TimeHour(TimeCurrent());
if (CurrentHour!=hh)
{
OrderSend(Symbol(),OP_BUY,0.01,Ask,3,Bid-3*Point,Bid+3*Point);
hh=TimeHour(TimeCurrent());
}

но у меня открывается бесчисленное количество ордеров