Скачать MetaTrader 5

Проблема с сигналами - страница 3

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Victor Nikolaev
Модератор
14976
Victor Nikolaev  
david2:


Точнее так:


Если делать, то уж так

int start()
{
   Delete(OP_BUYSTOP); 
   Delete(OP_SELLSTOP); 

   return(0);
}

void Delete(int OP)
{   
   for (int pos=OrdersTotals()-1;pos>=0;pos--) 
   {   
      if (!OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)) continue;
      if (OrderSymbol()!=Symbol())                     continue;
      if (OrderType()==ord)                            OrderDelete(OrderTicket(),CLR_NONE);
   }
} 

Лучше примерно так, хотя не лучший вариант

ivan
313
ivan  

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

У меня ордера Buy & Sell идут независимо друг от друга, использую следующий код для удаления предыдущих ордеров:

if (OrderType() == OP_SELLSTOP) 
{ 
      if( Сигнал ) 
      {
               OrderDelete(OrderTicket()-1); // закрываем позицию
                // return(0); // выходим
              }   
              }  
              
//-------------------------------------------------------
//-------------------------------------------------------                     
if (OrderType() == OP_BUYSTOP) 
{ 
      if( Сигнал )     
      {
         OrderDelete(OrderTicket()-1); // закрываем позицию
                // return(0); // выходим         
              }   
              }  
Допустим идет сигнал на удаление предыдущего ордера OP_SELLSTOP, но на самом деле перед ним установлен OP_BUYSTOP, и согласно коду советник удаляет OP_BUYSTOP, как сделать чтобы удаляло не OP_BUYSTOP, а предидущий OP_SELLSTOP?
Victor Nikolaev
Модератор
14976
Victor Nikolaev  
berezhnuy:

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

У меня ордера Buy & Sell идут независимо друг от друга, использую следующий код для удаления предыдущих ордеров:

Допустим идет сигнал на удаление предыдущего ордера OP_SELLSTOP, но на самом деле перед ним установлен OP_BUYSTOP, и согласно коду советник удаляет OP_BUYSTOP, как сделать чтобы удаляло не OP_BUYSTOP, а предидущий OP_SELLSTOP?


Делать все через n-ое место видимо традиция, ну или привычка
ivan
313
ivan  

.

Прошу прощения ордера не Buy а Buystop

Вот сам код моего советника

extern int     Magic=5675;
extern int     Orders =1;
extern int     StopLoss=0;
extern int     TakeProfit=0;
extern string     ______= "Параметры блока MoneyManagement";
extern double    Lots = 0.1;
extern bool      MoneyManagement=false;
extern int       MarginPercent=3;
extern int       TrailingStop=50;

//----------------------------------
double SL,TP;
int ticket;
double lots;
static int prevtime = 0;
//-- Подключаемые модули --
#include <stderror.mqh>
#include <stdlib.mqh>
//+=================================================================================+
//| expert initialization function                                                  |
//+=================================================================================+
int init()
  {
//----
   
//----
   return(0);
  }
//+=================================================================================+
//| expert deinitialization function                                                |
//+=================================================================================+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+=================================================================================+
//| expert start function                                                           |
//+=================================================================================+
int start()
  { 
if (Time[0] == prevtime) return(0); // Бар прежний, а следовательно выходим
   prevtime = Time[0]; // Свежий бар, запоминаем время
//+=================================================================================+
// Объявляем переменные
int total, cnt;
int err;
// Вычисляем начальные параметры индикаторов для поиска условий входа

  
  total=OrdersTotal();
Comment( LotsCounting() );
//+=================================================================================+
  // Проверка средств
  if(AccountFreeMargin()<(1000*Lots))
     {
       Print("We have no money. Free Margin = ", AccountFreeMargin());   
       return(0);  
     }
//===========================  Открытие позиций  ===================================+  
if(!ExistOrders("0", OP_SELLSTOP, Magic,0))
  {
//+=================================================================================+
// Проверка условий для совершения сделки селл 
if(  Сигнал  )
       {
     SL=0;TP=0;
      if(StopLoss>0)   SL=Bid+Point*StopLoss;
      if(TakeProfit>0) TP=Bid-Point*TakeProfit;
      lots=LotsCounting(); 
   ticket=OrderSend(Symbol(),OP_SELLSTOP,lots,p2,3,SL,TP,"Продаем- тра-ля-ля",Magic,0,Red);
   if(ticket < 0)
   {
            Print("Ошибка открытия ордера SELL #", GetLastError()); 
            Sleep(10000);  
            prevtime = Time[1]; 
            return (0); 
         } 
       }
     }

//+=================================================================================+
if (!ExistOrders("0", OP_BUYSTOP, Magic,0))
  {

//+=================================================================================+
  // Проверка условий для совершения сделки бай
if(  Сигнал  )
       {
      SL=0;TP=0;
      if(StopLoss>0)   SL=Ask-Point*StopLoss;
      if(TakeProfit>0) TP=Ask+Point*TakeProfit;
      lots=LotsCounting();    
   ticket=OrderSend(Symbol(),OP_BUYSTOP,lots,p2,3,SL,TP,"Покупаем- хи-хи ",Magic,0,Green);
   if(ticket < 0) 
   {
            Print("Ошибка открытия ордера BUY #", GetLastError()); 
            Sleep(10000); 
            prevtime = Time[1]; 
            return (0);
         } 
       }
     }
//+=================================================================================+
//======================== конец блока открытия позиций ============================+
 
//========================== Закрытие позиций ======================================+
   for ( int v = OrdersTotal() - 1; v >= 0; v -- )                  
   {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))                
      {           
        if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)     
        { 
//+=================================================================================+
//+================================= TrailingStop ==================================+
if(OrderType() == OP_SELL)
   {
if((OrderOpenPrice()-Ask) > (Point*TrailingStop))///ПОСЛЕ ЭТОГО УСЛОВИЯ НЕ ПРОХОДИТ!!!
      { 
if((OrderStopLoss() > (Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
         {
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
         }
      }
   }
//+=================================================================================+
if(OrderType() == OP_BUY)
   {
if((Bid-OrderOpenPrice()) > (Point*TrailingStop))///ПОСЛЕ ЭТОГО УСЛОВИЯ НЕ ПРОХОДИТ!!!
      { ///ПОСЛЕ ЭТОГО УСЛОВИЯ НЕ ПРОХОДИТ!!!
if(OrderStopLoss() < Bid-Point*TrailingStop || (OrderStopLoss()==0))
         {
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);  
         }
      }
   }
//+================================= TrailingStop ==================================+
//+=================================================================================+
    }  // Symbol()  
  } // select
} //total 
//============================== Конец блока закрытия ==============================+
   
  return(0);
  }
//ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ Конец функции int start() ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
 

//+=================================================================================+
//==================================== Блок ММ =====================================+ 
double LotsCounting() 
{ 
double lots=Lots;
   if (MoneyManagement)      
   {
      double lotsize=MarketInfo(Symbol(),MODE_LOTSIZE);
      double freemargin=AccountFreeMargin();
      lots=0; if (lotsize>0) lots=NormalizeDouble((MarginPercent*freemargin/lotsize),2);
      Comment(NormalizeDouble((MarginPercent*freemargin/lotsize),2));    
      }
   if (lots>5) lots=4.9; if (lots<0.1) lots=0.1;return (lots);   
   }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.03.2008                                                     |
//|  Описание : Возвращает флаг существования ордеров.                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время установки)          |
//+----------------------------------------------------------------------------+
bool ExistOrders(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal(), ty;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ty=OrderType();
      if (ty>1 && ty<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ty==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (ot<=OrderOpenTime()) return(True);
          }
        }
      }
    }
  }
  return(False);
}
//+=================================================================================+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает номер бара открытия последней позиции или -1.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    op - операция                   (   -1       - любая позиция)           |
//|    mn - MagicNumber                (   -1       - любой магик)             |
//+----------------------------------------------------------------------------+
int NumberOfBarOpenLastPos(string sy="0", int tf=0, int op=-1, int mn=-1)
 {
  datetime t;
  int      i, k=OrdersTotal();

  if (sy=="" || sy=="0") sy=Symbol();
  for (i=0; i<k; i++) 
  {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
    {
      if (OrderSymbol()==sy)
       {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL)
         {
          if (op<0 || OrderType()==op)
           {
            if (mn<0 || OrderMagicNumber()==mn)
             {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(iBarShift(sy, tf, t, True));
}
khorosh
8888
khorosh  
berezhnuy:

.

Прошу прощения ордера не Buy а Buystop

Вот сам код моего советника

Я же вам писал как сделать, чтобы повторно по сигналу ордера не открывались. Попробую объяснить ещё раз немного по другому. Если сигнал бай на 2 баре отсутствует, а сигнал бай на 1 баре есть - устанавливаем ордер. В этом случае условие на следующих барах после открытия ордера не будут выполняться и новые ордера не будут открываться, пока сигнал не исчезнет и не появится вновь.

ivan
313
ivan  

Я не сильно понимаю в этом, я только учусь. Подскажите пожалуйста кодом, как проверить есть ли сигнал на 2м бари и на первом.

Допутим вот услови

  up=iFractals(NULL,0,MODE_UPPER,2);
  down=iFractals(NULL,0,MODE_LOWER,2);
  teeth_val=iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORTEETH, 2);



   if(up!=0 && Open[2]>teeth_val && Close[2]>teeth_val)   BuySignal
   if(down!=0 && Open[2]<teeth_val && Close[2]<teeth_val)   SellSignal
khorosh
8888
khorosh  
berezhnuy:

Я не сильно понимаю в этом, я только учусь. Подскажите пожалуйста кодом, как проверить есть ли сигнал на 2м бари и на первом.

Допутим вот услови

Здесь у вас фракталы не задействованы в условии, а на словах вы писали, что они должны быть в условии. Дайте лучше картинку со стрелками на графике - ситуацию условия открытия байстопа. Можете в личку.

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