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

 
Прошу ответить в порядке очереди. Имею индикатор, отображаемый гистограммой. При присоединении или после восстановления связи показывает опупенное значение. Поставил условие при первом запуске обнулять 0-ую ячейку массива. Причем ставил в ините - не помогало. Обнуляю ее в старте - норма. (это по поводу присоединения). по поводу разрыва сети. поставил в старте условие: if(GetLastError()==6)zas[0]=0.0; - не помогает. чую банальность вопроса, но сам теряюсь в догадках - видимо пробел в знаниях.
 
dikson1976-1:
Прошу ответить в порядке очереди. Имею индикатор, отображаемый гистограммой. При присоединении или после восстановления связи показывает опупенное значение. Поставил условие при первом запуске обнулять 0-ую ячейку массива. Причем ставил в ините - не помогало. Обнуляю ее в старте - норма. (это по поводу присоединения). по поводу разрыва сети. поставил в старте условие: if(GetLastError()==6)zas[0]=0.0; - не помогает. чую банальность вопроса, но сам теряюсь в догадках - видимо пробел в знаниях.

Без кода, ни как.
 

Dozol:



Попробуй, перебирать ордера в обратном порядке.

 for(i=OrdersTotal()-1;i>=0;i--)
      {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         {
     // и тд
         }
       }
 
Справился сам. Не напрягайтесь. Всем спасибо.
 
Dozol:

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

int Zakrit_vse() ...

Для вставки кода на форуме используйте SRC

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

int Zakrit_vse()
{  
if (OrdersTotal()>0)
{  for (int i=OrdersTotal()-1; i>=0; i--)
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderSymbol()!=Symbol()) continue;
      
         //--- Close pending orders
         if (OrderType()==OP_BUYLIMIT  ||
             OrderType()==OP_BUYSTOP   ||
             OrderType()==OP_SELLLIMIT ||
             OrderType()==OP_SELLSTOP)         
         {  
            OrderDelete(OrderTicket(),CLR_NONE)
            Prov_oshibok();
            return(0);
         }
         
         //--- Close opened position BUY
         if (OrderType()==OP_BUY)
         {
            RefreshRates();
            OrderClose(OrderTicket(),OrderLots(),Bid,100,CLR_NONE);
            Prov_oshibok();
            return(0);
         }
         //--- Close opened position SELL
         if (OrderType()==OP_SELL)
         {
            RefreshRates();
            OrderClose(OrderTicket(),OrderLots(),Ask,100,CLR_NONE);
            Prov_oshibok();
            return(0);
         }
}  }  }
}
 
Dozol:

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


Зачем выдумывать велосипед, когда уже все придумано до Вас. К примеру. Не забудьте это.
 

Помогите! Есть код советника по внешнему канальному индикатору (при достижении верхней границы канала сделка открывается на продажу - закрывается при достижении нижней границы, на покупку в обратном порядке). По непонятным причинам не открывает сделки, не могу найти ошибку. С другим канальным индикатором работает идеально. Сразу оговорю буферы все подобрал.

Код прилагаю

extern double Lots = 0.1;
extern string Сomment = "TMA Canal2";
extern int TakeProfit = 20;
extern int StopLoss = 20;
extern int Slippage = 2; // проскальзывание
extern int Magic = 124;

extern string Indi = "Данные индикатора";
extern string TimeFrame = "current time frame";
extern int TMAPeriod = 56;
extern int Price = PRICE_CLOSE;
extern double ATRMultiplier = 2.0;
extern int ATRPeriod = 100;
extern double TrendThreshold = 0.5;
extern bool ShowCenterLine = false;

double PriceHigh, PriceLow, SL, TP;
int ticket;

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
if (Digits ==3 || Digits ==3) // для пятизначного брокера
{
TakeProfit *= 10;
StopLoss *= 10;
Slippage *= 10;
}
return(0);
}

//+------------------------------------------------------------------+
//| Calculate open positions |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
{
int buys=0,sells=0;
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==124)
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++;
}
}
//---- return orders volume
if(buys>0) return(buys);
else return(-sells);
}

//+------------------------------------------------------------------+
//| Check for open order conditions |
//+------------------------------------------------------------------+
void CheckForOpen()
{
double PriceHigh, PriceLow;
int ticket;
//---- go trading only for first tiks of new bar
if(Volume[0]>1) return;

PriceHigh = iCustom (Symbol(), 0, "TMALine", TimeFrame, TMAPeriod, Price, ATRMultiplier, ATRPeriod, TrendThreshold, ShowCenterLine, 1, 0);
PriceLow = iCustom (Symbol(), 0, "TMALine", TimeFrame, TMAPeriod, Price, ATRMultiplier, ATRPeriod, TrendThreshold, ShowCenterLine, 2, 0);


if(Open[1]>PriceHigh || Close[1]>PriceHigh || High[1]>PriceHigh && Ask<=PriceHigh)

{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"TMA Canal2",124,0,Red);
return;
}
//---- buy conditions
if(Open[1]<PriceLow || Close[1]<PriceLow || Low[1]<PriceLow && Bid>=PriceLow)

{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"TMA Canal2",124,0,Blue);
return;
}
//----
}
//+------------------------------------------------------------------+
//| Check for close order conditions |
//+------------------------------------------------------------------+
void CheckForClose()
{
double PriceHigh, PriceLow;
//---- go trading only for first tiks of new bar
if(Volume[0]>1) return;

PriceHigh = iCustom (Symbol(), 0, "TMALine", TimeFrame, TMAPeriod, Price, ATRMultiplier, ATRPeriod, TrendThreshold, ShowCenterLine, 1, 0);
PriceLow = iCustom (Symbol(), 0, "TMALine", TimeFrame, TMAPeriod, Price, ATRMultiplier, ATRPeriod, TrendThreshold, ShowCenterLine, 2, 0);

for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=124 || OrderSymbol()!=Symbol()) continue;
//---- check order type
if(OrderType()==OP_BUY)
{
if(Open[1]>PriceHigh || Close[1]>PriceHigh || High[1]>PriceHigh) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
break;
}
if(OrderType()==OP_SELL)
{
if(Open[1]<PriceLow || Close[1]<PriceLow || Low[1]<PriceLow) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
break;
}
}
//----
}

//+------------------------------------------------------------------+
//| Start function |
//+------------------------------------------------------------------+
void start()
{
//---- check for history and trading
if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
//----
}
//+------------------------------------------------------------------+

 
ZahvatkiN:

Приветствую всех уважаемые программисты, я новичок в mql4, работать со SL и TP умею, но когда встала необходимость закрывать ордера по противоположному сигналу индикатора появилась проблема, я никак не соображу как работает функция подсчёта ордеров OrderSelect(), вот часть кода простого советника, который работает по Стохастику, т.е. перепродан и пересечён между 1 и 2 баром открываем покупку, далее перекуплен и пересечён закрываем покупку и тут же открываем продажу и т.д. Я знаю что для перебора ордеров используется цикл, он в коде есть, но получается в процессе торгов так что ордер только открылся и сразу закрывается т.к. условия открытия покупки совпадают с условиями закрытия продажи и как ему объяснить, что этого делать не надо я не понимаю, объясните пожалуйста.

Для вставки кода служит кнопка SRC!

Как Вы написали это, также делайте добавления, пользуясь Документацией!

Если Вы скопировали, обращайтесь к Автору для доработок или в Работу!

 


Еще раз добавлю. Ну сколько раз уже говорилось, для вставки кода используйте в верхней строке кнопку

И желательно придерживаться стилей написания кодов.... Желательно, но не обязательно. Но большинству легко понятный код ответят скорей всего.

 

Приветствую всех уважаемые программисты, я новичок в mql4, работать со SL и TP умею, но когда встала необходимость закрывать ордера по противоположному сигналу индикатора появилась проблема, я никак не соображу как работает функция подсчёта ордеров OrderSelect(), вот часть кода простого советника, который работает по Стохастику, т.е. перепродан и пересечён между 1 и 2 баром открываем покупку, далее перекуплен и пересечён закрываем покупку и тут же открываем продажу и т.д. Я знаю что для перебора ордеров используется цикл, он в коде есть, но получается в процессе торгов так что ордер только открылся и сразу закрывается т.к. условия открытия покупки совпадают с условиями закрытия продажи и как ему объяснить, что этого делать не надо я не понимаю, объясните пожалуйста.

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

if(buy1sOpen())
         {
         OrderSend(Symbol(), OP_BUY, lots, Ask, Slippage, 0, 0, "", magic, 0, Blue);
         }
      if(sell1sOpen()) 
         {
         OrderSend(Symbol(), OP_SELL, lots, Bid, Slippage, 0, 0, "", magic, 0, Red);
         }
         
      for(int i=0; i<OrdersTotal(); i++)
         {
         OrderSelect(i,SELECT_BY_POS);
         if(buy1sClose()) 
           {
           OrderClose(i, lots, Ask, Slippage, Blue);
           }
         if(sell1sClose()) 
           {
           OrderClose(i, lots, Bid, Slippage, Red);
           }
         }
         
      }
   }
bool buy1sOpen()
   {
   Sm1=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_MAIN,1);
   Ss1=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_SIGNAL,1);
   Sm2=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_MAIN,2);
   Ss2=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_SIGNAL,2);
   if(Sm1>Ss1 && Sm2<Ss2 && Sm1<30)
      return(true);
      return(false);
   }
bool sell1sOpen()
   {
   Sm1=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_MAIN,1);
   Ss1=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_SIGNAL,1);
   Sm2=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_MAIN,2);
   Ss2=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_SIGNAL,2);
   if(Sm1<Ss1 && Sm2>Ss2 && Sm1>70)
      return(true);
      return(false);
   }
bool buy1sClose()
   {
   Sm1=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_MAIN,1);
   Ss1=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_SIGNAL,1);
   Sm2=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_MAIN,2);
   Ss2=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_SIGNAL,2);
   if(Sm1<Ss1 && Sm2>Ss2 && Sm1>70)
      return(true);
      return(false);
   }
bool sell1sClose()
   {
   Sm1=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_MAIN,1);
   Ss1=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_SIGNAL,1);
   Sm2=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_MAIN,2);
   Ss2=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_SIGNAL,2);
   if(Sm1>Ss1 && Sm2<Ss2 && Sm1<30)
      return(true);
      return(false);
   }
Причина обращения: