Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 374

 

Всем привет. помогите разобраться с сложившейся ситуацией.

почему в одном случае testF2 при отнимании Buf0[i]=iCCI(NULL,0,8,PRICE_OPEN,i-1)-iCCI(NULL,0,8,PRICE_OPEN,i); все происходит замечательно как нужно,

а в другом случае testF1 при техже действиях Buf0[i]=iMA(NULL,0,8,0,MODE_EMA,PRICE_OPEN,i-1)-iMA(NULL,0,8,1,MODE_SMA,PRICE_OPEN,i); происходит слет последнего бара? почему в случае с iCCI этого непроисходит, а в случае iMA происходит слет бара??????

можно ли это както исправить?

Файлы:
testf1.mq4  1 kb
testf2.mq4  1 kb
 

Buf0[i]=iMA(NULL,0,8,0,MODE_EMA,PRICE_OPEN,i-1)-iMA(NULL,0,8,1,MODE_SMA,PRICE_OPEN,i);

для ема в бессконечность вас кинет при расчете -1 бара, когда i=0

лучше так:

Buf0[i]=iMA(NULL,0,8,0,MODE_EMA,PRICE_OPEN,i)-iMA(NULL,0,8,1,MODE_SMA,PRICE_OPEN,i+1);

и если надо сдвиг как в приведенном вами варианте на 1-н бар вправо, лучше реализуйте его явно в инит через SetIndexShift(0,1);

 
ALXIMIKS:

Buf0[i]=iMA(NULL,0,8,0,MODE_EMA,PRICE_OPEN,i-1)-iMA(NULL,0,8,1,MODE_SMA,PRICE_OPEN,i);

для ема в бессконечность вас кинет при расчете -1 бара, когда i=0

лучше так:

Buf0[i]=iMA(NULL,0,8,0,MODE_EMA,PRICE_OPEN,i)-iMA(NULL,0,8,1,MODE_SMA,PRICE_OPEN,i+1);

и если надо сдвиг как в приведенном вами варианте на 1-н бар вправо, лучше реализуйте его явно в инит через SetIndexShift(0,1);



спасибо Вам большое, но Я все прекрасно это понимаю, а вот почему с iCCI, это прокатывает а с iMA нет???
 
       if ((NormalizeDouble(priceopen+start*Point,Digits)<=Bid)&&(NormalizeDouble(Bid-sl*Point,Digits)>NormalizeDouble(dist*Point,Digits)))
         {   
                sl=NormalizeDouble(Bid-dist*Point,Digits); 
Ekburg
:


не правильное условие, вы рассчитываете расстояние от цены до котировки выставления ордера, а надо от цены, до текущего стопа!:)

при этом должны быть разные расчёты для лонгов и для шортов;) а то в одних случаях будет расчёт минусовой, в другом положительный. соответственно в одних направлениях трейлинг работать будет, а в других нет..

тут нужно два блока, если шорт стоит, то направляет в первый блок, если лонг - во-второй, после идут расчёты, проверки и сам трейлинг


все равно ничего не выходит... пробую только лонг, перепробовал уже столько всего, что не помню что делал что нет))
 
clubsmi:


спасибо Вам большое, но Я все прекрасно это понимаю, а вот почему с iCCI, это прокатывает а с iMA нет???


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

а применения МА, в частности ЕМА, как я думаю, приводит к их наглядности.

 
vadynik:

все равно ничего не выходит... пробую только лонг, перепробовал уже столько всего, что не помню что делал что нет))

вместо sl поставьте OrderStopLoss()
 
Vinin:

Так и будете на подсказках жить?
До тех пор, пока не стану знатоком в этом деле.
Вам ведь теперь не нужны подсказки? :)
 

Есть программа, которая открывает два ордера на покупку или на продажу, скажем по EURAUD и AUDUSD. Программа работает исключительно, если в терминале по этим или другим парам не открыты ордера. Если хотя бы в один ордер в терминале присутствует, то сделки не открываются. Вопрос - как запрограммировать открытие ордеров независимо от того, есть ли в терминале открытые ордера или нет? Заранее благодарен за ответ.

extern double lotAU=1.3;
extern double lotEA=1.0;
extern double Profit=30;
extern int Operation=0;
extern string Сomment           = "KVAZ";
extern int Magic                = 1111;


//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {

double prof;
double bidEA = MarketInfo("EURAUD",MODE_BID);
double askEA = MarketInfo("EURAUD",MODE_ASK);
double bidAU = MarketInfo("AUDUSD",MODE_BID);
double askAU = MarketInfo("AUDUSD",MODE_ASK);

string symEA = "EURAUD";
string symAU = "AUDUSD";

for(int i=OrdersTotal()-1; i>=0; i--)
{
 OrderSelect(i,SELECT_BY_POS);
 prof=prof+OrderProfit();
 Print("Profit="+prof);
}
if(prof>=Profit)
{
 for(i=OrdersTotal()-1; i>=0; i--)
 {
  OrderSelect(i,SELECT_BY_POS);
  {
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5,0);
  }
 }
}
if(OrdersTotal()==0)
{
 if(Operation==0)
 {
  OrderSend(symEA,OP_BUY,lotEA,askEA,3,0,0,"KVAZ",Magic,0,Blue);
  OrderSend(symAU,OP_BUY,lotAU,askAU,3,0,0,"KVAZ",Magic,0,Blue); 
 }
 if(Operation==1)
 {
  OrderSend(symEA,OP_SELL,lotEA,bidEA,3,0,0,"KVAZ",Magic,0,Red);
  OrderSend(symAU,OP_SELL,lotAU,bidAU,3,0,0,"KVAZ",Magic,0,Red);
 }
}  
   return(0);
  }
 
alexey1979621:

Есть программа, которая открывает два ордера на покупку или на продажу, скажем по EURAUD и AUDUSD. Программа работает исключительно, если в терминале по этим или другим парам не открыты ордера. Если хотя бы в один ордер в терминале присутствует, то сделки не открываются. Вопрос - как запрограммировать открытие ордеров независимо от того, есть ли в терминале открытые ордера или нет? Заранее благодарен за ответ.


Убрать проверку
if(OrdersTotal()==0)
 
evillive:

Убрать проверку
Да теперь открывает, но целую кучу сделок, а мне нужно, чтобы по заданным парам, скажем по EURAUD и AUDUSD открывались только две сделки.