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

 
Craft:

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

На произвольный для обучения:

Сделки не выставляются, подскажите пожалуйста в чём причина, как подправить код.


double MA_1[]; // нет обьявления размера, не видно как (локально или глобально) обьявлен, 
// не видно оператора двигающего индекс массива.
// лучше пока не освоили работу с массивами обьявите переменные и не парьтесь

  double MA_0=iMA(NULL,0,Period_MA,0,MODE_EMA,PRICE_CLOSE,0);
  double MA_1=iMA(NULL,0,Period_MA,0,MODE_EMA,PRICE_CLOSE,1);
  
  if (MA_1 < MA_0)
     {                                          // ..МА последнего бара выше предыдущего
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
   if (MA_1 > MA_0)
     {                                          // ..МА последнего бара ниже предыдущего
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }
 

Urain, спасибо, не перестаю удивляться логике mql, а если через for(int i=1; попробовать, скрипт не упроститься - не подскажите, как оформить, не могу ещё логику языка прочувствовать, через что определить оператор двигающий массив?

P. S. Массив я объявлял, по ошибке в скрипте примера удалил:

   double MA_1[];
   ArrayResize(MA_1,Period_MA);

   MA_1[0]=iMA(NULL,0,Period_MA,0,MODE_EMA,PRICE_CLOSE,0);

   if (MA_1[1] < MA_1[0])
     {                                          // 
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
   if (MA_1[1] > MA_1[0])
     {                                          // 
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }
 
Abzasc:
Разницу в ценах. Как следствие - разные, до противоположного, результаты индикаторов...
чето не вижу я там разного. Забей на индикаторы, еще раз повторяю, для тебя верный тот, на котором ты ведешь торговлю. Ты внимание совсем не на том концентрируешь, что нужно.
 
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red

extern int n = 20;
extern int t3_period = 5;
extern double b = 0.618;
extern int mBars = 300;
extern int Bars.Count = 0;
int i,t,c;
double Buf1[],Buf2[],CF_p[5001],CF_n[5001],Ch_p[5001],Ch_n[5001],k_n,k_p,ch_p,ch_n,cff_p,cff_n,
AcBars,t3,t32,A1,A2,b2,b3,c1,c2,c3,c4,e1,e2,e3,e4,e5,e6,n1,w1,w2,e12,e22,e32,e42,e52,e62;


//+------------------------------------------------------------------+
int init() {
SetIndexStyle(0, DRAW_LINE);
SetIndexBuffer(0, Buf1);
SetIndexStyle(1, DRAW_LINE);
SetIndexBuffer(1, Buf2);
return(0); }
//+------------------------------------------------------------------+
int start() {
int limit;
if (IndicatorCounted()<0) return(-1);
limit=Bars-IndicatorCounted();
if (Bars.Count>0 && limit>Bars.Count) limit=Bars.Count;
for(int i=0; i<limit; i++)
{

b2=b*b; b3=b2*b; c1=-b3; c2=(3*(b2+b3)); c3=-3*(2*b2+b+b3); c4=(1+3*b+b3+3*b2); n1=t3_period;

if(n1<1) n1=1; n1=1+0.5*(n1-1); w1=2/(n1+1); w2=1-w1;

if(AcBars==0) AcBars=Bars-mBars;

for(c=AcBars; c<=Bars-1; c ++) { i=Bars-1-c; {

if(Close[i]>Close[i+1]) { Ch_p[i]=Close[i]-Close[i+1]; CF_p[i]=Ch_p[i]+CF_p[i+1]; Ch_n[i]=0; CF_n[i]=0; }
else { Ch_p[i]=0; CF_p[i]=0; Ch_n[i]=Close[i+1]-Close[i]; CF_n[i]=Ch_n[i]+CF_n[i+1]; }}

for(t=i+n; t>=i; t--) { ch_p=Ch_p[t]+ch_p; ch_n=Ch_n[t]+ch_n ; cff_p=CF_p[t]+cff_p; cff_n=CF_n[t]+cff_n; }

k_p=ch_p-cff_n; k_n=ch_n-cff_p;

A1=k_p; e1=w1*A1+w2*e1; e2=w1*e1+w2*e2; e3=w1*e2+w2*e3; e4=w1*e3+w2*e4;
e5=w1*e4+w2*e5; e6=w1*e5+w2*e6; t3=c1*e6+c2*e5+c3*e4+c4*e3; Buf1[i]=t3;

A2=k_n; e12=w1*A2+w2*e12; e22=w1*e12+w2*e22; e32=w1*e22+w2*e32; e42=w1*e32+w2*e42;
e52=w1*e42+w2*e52; e62=w1*e52+w2*e62; t32=c1*e62+c2*e52+c3*e42+c4*e32; Buf2[i]=t32;

AcBars=AcBars+1; ch_p=0; ch_n=0; cff_p=0; cff_n=0; }
}

return(0); }


Подскажите где ошибка не обновляется, историю показывает нормально а online нет

Файлы:
 

Добрый день. Массив объявил, оператор двигающий индекс массива задал, ордера не выставляются. Подскажите, что не так.

   double MA_1[];
   ArrayResize(MA_1,Period_MA);

   for(int j=0;j<=Period_MA-1;j++)
   MA_1[j]=iMA(NULL,0,Period_MA,0,MODE_EMA,PRICE_CLOSE,j);

   
   if (MA_1[j+1] < MA_1[j])
     {                                          // 
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
   if (MA_1[j+1] > MA_1[j])
     {                                          // 
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }
 

OrderSend попробуйте прописать, тогда всё получиться...

Хелп стандартный в MetaEditore читали? Если нет, прочтите, весь... 

Craft:

Добрый день. Массив объявил, оператор двигающий индекс массива задал, ордера не выставляются. Подскажите, что не так.

 
Ребяты, подскажите, возможно ли переделать функцию Игоря Кима, которая закрывает все убыточные ордера, убыток которых превысил некоторое значение:
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 25.04.2008                                                     |
//|  Описание : Закрытие тех позиций, у которых убыток в валюте депозита       |
//|             превысил некоторое значение                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    pr - профит/убыток                                                      |
//+----------------------------------------------------------------------------+
void ClosePosBySizeLossInCurrency(string sy="", int op=-1, int mn=-1, double pr=0) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderProfit()+OrderSwap()<-MathAbs(pr)) ClosePosBySelect();
          }
        }
      }
    }
  }
}
Мне необходимо найти одну открытую позицию, имеющую самый большой убыток.
Суть в том, что мне нужно далее найти позицию, имеющую профит больше самой убыточной позы и встречно их закрыть.
Мож кто уже имеет наработки по данному вопросу иль сталкивался уже с такой проблемой?
 
почему три индикатора, действующие на разных принципах, показывают почти одинаковую картинку ( спирман, стохастик, и макд-рси) - а показать верное движение  и вход  с вероятностью выше 60% не могут? или могут?
 
Все привет! Вот встал вопрос о том, какой код нужен для закрытия ордера, после того как он прошол точку Х в прибыле и начел снижаться до точке Y>OrderOpenPrice, после этого надо закрыть.
 
StatBars:

OrderSend попробуйте прописать, тогда всё получиться...

Хелп стандартный в MetaEditore читали? Если нет, прочтите, весь...


Из детского возраста задавать вопрос не обратившись к хэлпу и яндексу вырос. Сендов море, но позиции не открываются:

double MA_1[];
   ArrayResize(MA_1,Period_MA);

   for(int j=0;j<=Period_MA-1;j++)
   MA_1[j]=iMA(NULL,0,Period_MA,0,MODE_EMA,PRICE_CLOSE,j);

   
   if (MA_1[j+1] < MA_1[j])
     {                                          // 
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
   if (MA_1[j+1] > MA_1[j])
     {                                          // 
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }
   // Открытие ордеров
   while(true)                                  // Цикл закрытия орд.
     {
      if (Total==0 && Opn_B==true)              // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();                        // Обновление данных
         SL=Bid - New_Stop(StopLoss);     // Вычисление SL откр.
         TP=Bid + New_Stop(TakeProfit);   // Вычисление TP откр.
         Alert("Попытка открыть Buy. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL,TP);//Открытие Buy
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Buy ",Ticket);
            return;                             // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
      if (Total==0 && Opn_S==true)              // Открытых орд. нет +
        {                                       // критерий откр. Sell
         RefreshRates();                        // Обновление данных
         SL=Ask + New_Stop(StopLoss);     // Вычисление SL откр.
         TP=Ask - New_Stop(TakeProfit);   // Вычисление TP откр.
         Alert("Попытка открыть Sell. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,2,SL,TP);//Открытие Sel
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Sell ",Ticket);
            return;                             // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
      break;                                    // Выход из while
     }
Причина обращения: