Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 135

 
Vitaly Muzichenko:
Вы подставляете сразу цены, или их получаете и потом подставляете в расчёт?
Vitaly Muzichenko:
Вы подставляете сразу цены, или их получаете и потом подставляете в расчёт?
   int k=period;
   for(int i=1; i<=period; i++)
   {  
      H1_Close[i]=Close[k];
      k--;
   }
   Я их беру кусок таймсессии равный периоду начиная с последнего закрытого бара и переворачиваю чтобы в массиве он лежал зеркально т.к. в тайсессии 1-это предпоследний бар, а как я понял расчет должен начинаться с i-го
   т.е. моя функция должна возвращать значение SMMA последнего закрытого бара.
 
Всем добры день.
В нижеприведенном коде закодирована простая идея.
Если последний закрытый ордер СЕЛ
Если последний закрытый  ордер закрылся по СЛ
Открыть ордер СЕЛ
if (OrderSelect (Ht-1,SELECT_BY_POS, MODE_HISTORY))                                            
if ( OrderType ()==OP_SELL)                                            
X = OrderProfit( );                                            

if (OrderSelect (Ht-1,SELECT_BY_POS, MODE_HISTORY))                                            
if ( OrderType ()==OP_BUY)                                              
if(X < 0)                                              

OrderSend(Symbol(),OP_SELL,0.1,Bid ,3,Ask+400*Point,Ask-200*Point,"17-10",123 );



ВОПРОС
При помощи какой языковой конструкции можно добавить в этот код еще два  новых условия (выделил красным)

Если последний закрытый ордер СЕЛ
Если ПРЕДпоследний ордер СЕЛ
Если последний закрытый ордер закрылся по СЛ
Если ПРЕДпоследний закрытый ордер закрылся по СЛ

Спасибо за помощь.


Буду очень признателен если напишете код, а не объясните на словах что нужно делать.
 
Здравствуйте. Я пишу скрипт для удаления всех отложенных ордеров. Однако он удаляет лишь один ордер. У меня всегда есть два отложенных ордера или один. В любом случае он удаляет один только Buy Stop. Для удаления Sell Stop нужно снова запустить скрипт, при условии, что нет других ордеров Buy Stop. Подскажите, где ошибка.

void DeleteOrders()
{
   int Total=OrdersTotal();
   for(int i=0;i<Total;i++)
      if(OrderSelect(i,SELECT_BY_POS))
      {
         int type=OrderType(), ticket=OrderTicket();
         bool c;
         switch(type)
         {
            case 4:
               c=OrderDelete(ticket);
               if(!c)
                  Print(GetLastError());
               break;
            case 5:
               c=OrderDelete(ticket);
               if(!c)
                  Print(GetLastError());
               break;         
         }
      }
}
 
0B53RV3R:
Здравствуйте. Я пишу скрипт для удаления всех отложенных ордеров. Однако он удаляет лишь один ордер. У меня всегда есть два отложенных ордера или один. В любом случае он удаляет один только Buy Stop. Для удаления Sell Stop нужно снова запустить скрипт, при условии, что нет других ордеров Buy Stop. Подскажите, где ошибка.

void DeleteOrders()
{
   int Total=OrdersTotal();
   for(int i=0;i<Total;i++)
      if(OrderSelect(i,SELECT_BY_POS))
      {
         int type=OrderType(), ticket=OrderTicket();
         bool c;
         switch(type)
         {
            case 4:
               c=OrderDelete(ticket);
               if(!c)
                  Print(GetLastError());
               break;
            case 5:
               c=OrderDelete(ticket);
               if(!c)
                  Print(GetLastError());
               break;         
         }
      }
}
направление перебора измените for(i=total-1;i>=0;i--)
 
Maxim Kuznetsov:
направление перебора измените for(i=total-1;i>=0;i--)
Спасибо, теперь работает. Правильно ли я понимаю, что при удалении ордера с индексом 0, ордеру с индексом 1 присваивается индекс 0, а при следующей итерации i == 1, а такого ордера получается нет. Скажите, так ли?
 
0B53RV3R:
Спасибо, теперь работает. Правильно ли я понимаю, что при удалении ордера с индексом 0, ордеру с индексом 1 присваивается индекс 0, а при следующей итерации i == 1, а такого ордера получается нет. Скажите, так ли?
Так.
 

Есть функция настраиваемых фракталом, ну блин, какая-то ужасно тяжёлая. Рисование объектов оставил только для визуального отображения правильности формирования фракталов - его не будет.

В‌опрос: как можно облегчить, а то тупит визуальное тестирование:

extern int FrLeft=15; // Баров слева
extern int FrRight=5; // Баров справа

//-----------------------------------------------------------------------------------------------
void OnTick()
{
int nFrUp= GetBarFractal(Symbol(),PERIOD_CURRENT,FrLeft,FrRight,0,MODE_UPPER); // Возвращает номер бара
int nFrDn= GetBarFractal(Symbol(),PERIOD_CURRENT,FrLeft,FrRight,0,MODE_LOWER); // Возвращает номер бара
double FrHigh = High[nFrUp]; // Цена верхнего фрактала
double FrLow  = Low [nFrDn]; // Цена нижнего фрактала

SetArrow("FrUp"+"_"+(string)Time[nFrUp], Time[nFrUp], High[nFrUp], clrDeepSkyBlue, 217, 2, ANCHOR_BOTTOM);
SetArrow("FrDn"+"_"+(string)Time[nFrDn], Time[nFrDn], Low[nFrDn], clrDeepPink, 218, 2, ANCHOR_TOP);

// Comment("Price: ",FrHigh,", Num: ",nFrUp,"\nPrice: ",FrLow,", Num: ",nFrDn);
}

//----------------------------------------------------------------------------------------------+
//---------------------- Возвращает номер бара фрактала (настраиваемый) ------------------------+
//----------------------------------------------------------------------------------------------+
int GetBarFractal(string symb,ENUM_TIMEFRAMES tf=0,int nLeft=2,int nRight=2,int numFr=0,int mode=MODE_UPPER) {
int i=0,cn=0,pos=0,r=0,l=0,e=0,equals,bars;
double _high[], _low[];
nLeft=nLeft<=2?2:nLeft;
nRight=nRight<=2?2:nRight;
equals=nLeft+nRight;
bars=Bars(symb,tf)-equals;
ArraySetAsSeries(_high,true);
ArraySetAsSeries(_low,true);

  for(pos=nRight+1; pos<bars; pos++) {
   r=nRight;
   if(mode==MODE_UPPER) {
    CopyHigh(symb,tf,0,pos+equals+1,_high);
    for(i=1; i<=r; i++) {
     if(_high[pos]<=_high[pos-i]) break;
   }}
   if(mode==MODE_LOWER) {
    CopyLow(symb,tf,0,pos+equals+1,_low);
    for(i=1; i<=r; i++) {
     if(_low[pos]>=_low[pos-i]) break;
   }}
   //--
   if(i==r+1) {
    l=nLeft;
    e=equals;
     for(int j=1; j<=l+equals; j++) {
      if(mode==MODE_UPPER) {
       if(_high[pos]<_high[pos+j])  break;
       if(_high[pos]>_high[pos+j])  l--;
       if(_high[pos]==_high[pos+j]) e--;
      }
      if(mode==MODE_LOWER) {
       if(_low[pos]>_low[pos+j])  break;
       if(_low[pos]<_low[pos+j])  l--;
       if(_low[pos]==_low[pos+j]) e--;
      }
      if(l==0) {
       cn++;
       if(cn>numFr) return(pos);
      }
      //--
      if(e<0) break;
   }}
  }
   Print(__FUNCTION__": Фрактал не найден");
  return(0);
}

//----------------------------------------------------------------------------------------------+
//------------------- Функция рисования значка на графике, объект OBJ_ARROW --------------------+
//----------------------------------------------------------------------------------------------+
void SetArrow(string nm="", datetime t1=0, double p1=0, color col=clrRed,
                                           int code=252, int width=1, int anchor=0) {
if(ObjectFind(0,nm)==-1) {
    ObjectCreate(0,nm,OBJ_ARROW,0,0,0);
    ObjectSetInteger(0,nm,OBJPROP_COLOR,col);
    ObjectSetInteger(0,nm,OBJPROP_ARROWCODE,code);
    ObjectSetInteger(0,nm,OBJPROP_ANCHOR,anchor);
    ObjectSetInteger(0,nm,OBJPROP_WIDTH,width);
    ObjectSetInteger(0,nm,OBJPROP_SELECTED,false);
    ObjectSetInteger(0,nm,OBJPROP_SELECTABLE,true);
    ObjectSetInteger(0,nm,OBJPROP_HIDDEN,false);
    ObjectSetDouble(0,nm,OBJPROP_PRICE,p1);
    ObjectSetInteger(0,nm,OBJPROP_TIME,t1);
   }
}

Спасибо!

 
Vitaly Muzichenko:

Есть функция настраиваемых фракталом, ну блин, какая-то ужасно тяжёлая. Рисование объектов оставил только для визуального отображения правильности формирования фракталов - его не будет.

В‌опрос: как можно облегчить, а то тупит визуальное тестирование:

Спасибо!

Облегчить можно только переделав всё это в индикатор. Тестирование тормозит даже комментарий в верхнем левом углу графика и особенно метки открытия и закрытия позиций, те которые ставит сам тестер.
 

Здравствуйте. Не подскажите новичку.

Вот пример:

   if(Условие1)

       if(Условие2)

        {

        }

   else

    {

    }

По программе Else должно относиться к if(условие1) и выполнится при невыполнении Условия1

А по сути оно же выполнится при невыполнении Условия2.‌

 
Andy-D:

Здравствуйте. Не подскажите новичку.

Вот пример:

   if(Условие1)

       if(Условие2)

        {

        }

   else

    {

    }

По программе Else должно относиться к if(условие1) и выполнится при невыполнении Условия1

А по сути оно же выполнится при невыполнении Условия2.‌


Имейте привычку ставить фигурные скобки сразу с условием

if(Условие)

{

}

A‌ по вашему вопросу так

if(Условие1)
   {
       if(Условие2)

        {

        }
    }
   else

    {

    }