Помогите еще одному чайнику

 
Как исключить открытие еще одной позиции на текущем баре? Учитывая, что на этом баре уже открывались и закрывались. Вэтом плане нравиться строка из советника SHE kanskigor, но почему то не срабатывает TrStop. Или дайте ссылочку на какой-нибудь ресурс.
 

Вот здесь есть нужная вам функция 'Полезные функции от KimIV'

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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));
}

А при открытии сделки предусматриваете дополнительное условие:

if (!NumberOfBarOpenLastPos(NULL, 0,-1, Magic)  ==0) {
   //Условие реализует запрет более одной сделки на 1 баре
 
// Проверка условий для совершения сделки бай
 if (! NumberOfBarOpenLastPos(NULL, 0,OP_BUY, Magic) ==0) { //запрет неск. поз на одном баре

//// тут условия на вход идут If....


// Проверка условий для совершения сделки селл
 if (! NumberOfBarOpenLastPos(NULL, 0,OP_SELL, Magic) ==0) { //запрет неск. поз на одном баре
 //// тут условия на вход идут If....

А вот это в конце кода...

//+----------------------------------------------------------------------------+
 //| Автор : Ким Игорь В. 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));



 
rid >>:

Вот здесь есть нужная вам функция 'Полезные функции от KimIV'

А при открытии сделки предусматриваете дополнительное условие:

Шустрый блин !

Пернатому привет !

 
Привет! Своему коту тож привет передавай!
 
Помогите исправить открытие ордера при пересечении 2х МА. А то он иногда открывает сразу несколько ордеров. Нужно чтоб открывал только один при пересечении.
 

Вставил функцию. Работу эксперта не проверял

И с закрытием позиций разберитесть. Что то не то там у вас...

#property copyright "Ron Thompson"
#property link      "http://www.lightpatch.com/forex"
// User Input
extern int       Magic = 1122;
extern double Lots=0.1;
//----------------------------
int init()  {   return(0);  }
int deinit()  {   return(0);  }
//------------------------------
int start()
  {
   double   cMAfst=0, pMAfst=0; double   cMAslo=0, pMAslo=0; double    MA100=0;
   int    total=0;  bool   found=false; int otype=0; double otime=0; int  cnt=0;
   // Error checking
   if(Bars<100){Print("bars less than 100");return(0);  }
   if(AccountFreeMargin()<(1000*Lots)) {Print("We have no money"); return(0); }
   // only one order at a time/per symbol 
   // so see if our symbol has an order open
   Comment("хи-хи, тра-ля-ля ");
   cMAfst=iMA(Symbol(),0,5 ,0,MODE_LWMA,PRICE_CLOSE, 1);
   pMAfst=iMA(Symbol(),0,5 ,0,MODE_LWMA,PRICE_CLOSE, 2);
   cMAslo=iMA(Symbol(),0,20,0,MODE_LWMA,PRICE_CLOSE, 1);
   pMAslo=iMA(Symbol(),0,20,0,MODE_LWMA,PRICE_CLOSE, 2);
   // rising or falling
   if ((pMAfst<=cMAslo && cMAfst>=cMAslo) || (pMAfst>=cMAslo && cMAfst<=cMAslo))
     {
      // check for existing order
      found=false;
      otype=-1;
      total=OrdersTotal();
      for(cnt=0;cnt<OrdersTotal();cnt++)
        {
         OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
         if(OrderSymbol()==Symbol())
           {
            if(OrderOpenTime()>Time[3])
              {
               found=true;
               otype=OrderType();
               break;
              }}}}
//---------------------------------------              
   if (found==true)
     {
      if (pMAfst<=cMAslo && cMAfst>=cMAslo && otype==1)  //exist sell
        {
         OrderClose(OrderTicket(),Lots,Bid,0,Red);
         if (NumberOfPositions(NULL, OP_BUY,Magic)< 1) {//если нет бай позиций
         Print("BUY  Order started  ",Ask);
         OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"BC Buy ",Magic,0,White);
         if(GetLastError()==0)Comment("BC_BUY  Order opened : ",Ask);
        }}
      if (pMAfst>=cMAslo && cMAfst<=cMAslo && otype==0)  // exist buy
        {
         OrderClose(OrderTicket(),Lots,Ask,0,White);
         if (NumberOfPositions(NULL, OP_SELL,Magic)<1)  {//если нет селл позиций
         Print("SELL Order started  ",Bid);
         OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"BC Sell",Magic,0,Red);
         if(GetLastError()==0)Comment("BC_SELL Order opened : ",Bid );
        }}}
   else // not found, so create
     {
      if (pMAfst<=cMAslo && cMAfst>=cMAslo)  //rising
        {
        if (NumberOfPositions(NULL, OP_BUY,Magic)< 1) {//если нет бай позиций
         Print("BUY  Order started  ",Ask);
         OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"BC Buy ",Magic,0,White);
         if(GetLastError()==0)Comment("BC_BUY  Order opened : ",Ask);
        }}
      if (pMAfst>=cMAslo && cMAfst<=cMAslo)  //falling
        {
        if (NumberOfPositions(NULL, OP_SELL,Magic)<1)  {//если нет селл позиций
         Print("SELL Order started  ",Bid);
         OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"BC Sell",Magic,0,Red);
         if(GetLastError()==0)Comment("BC_SELL Order opened : ",Bid );
        }}
     }
   return(0);
  }
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество позиций.                                 |
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++)                                    {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))      {
      if (OrderSymbol()==sy || sy=="")                   {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op)                   {
            if (mn<0 || OrderMagicNumber()==mn) kp++;
          }}}}}
  return(kp);
}
Причина обращения: