0
Да сегодня займусь. Как поправлю сообщу.
avatar

AM2

  • 17 декабря 2014, 16:33
0
Но по моему где -то ошибка в коде. После удаления не сработавших ордеров, одновременно выставляет все новые ордера по одной цене. Т.е. 10 ордеров стоплимит по 1.24500, вместо того, чтобы выставлять с шагом.


После тейка выставляет по одной цене серию ордеров, так было задумано.
avatar

AM2

  • 17 декабря 2014, 16:32
+1
Сейчас работает на 3-х парах, удаляет 2-ю отложку при срабатывании ордера, переводит в БУ.



Файл обновил в базе: www.opentraders.ru/downloads/519/
avatar

AM2

  • 16 декабря 2014, 22:30
0
Так вроде там было:


//+------------------------------------------------------------------+
//|                                                        Delta.mq4 |
//|                                            Copyright © 2014, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2014, AM2"
#property link      "http://www.forexsystems.biz"
#property description "Forex expert advisor"

//--- Inputs
extern int    Delta   = 200;  // расстояние до ордера и стопы
extern int    Slip    = 30;   // проскальзывание ордера
extern int    Try     = 5;    // количество попыток выставить ордер
extern double Lots    = 0.1;  // объем позиции
extern double MaxLot  = 5;    // максимальный объем позиции
extern double TickVol = 0.5;  // тиковый объем
extern int    MAGIC   = 333;  // магик
double lot,tickvol;
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void PutOrder()
  {
   int    res,b,s,err;
   double price;
   tickvol=iVolume(Symbol(),0,0);   
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
        {
         if(OrderType()==OP_BUYSTOP)b++;
         if(OrderType()==OP_SELLSTOP)s++; 
        }
      }
    }
    
   //--- buy
   if(b<1)
    {
     price=Ask+Delta*Point;
     res=OrderSend(Symbol(),OP_BUYSTOP,Lot(),fND(price),Slip,fND(price-Delta*Point),fND(price+Delta*Point),"",MAGIC,0,Blue);
      if(res<0)
        {
         Print("Ошибка: ",GetLastError());
         err++;
         Sleep(500);
         RefreshRates();
        }
      else
         Print("OK Order BUYSTOP");     
    }             
                    
   //--- sell 
   if(s<1)
    {
     price=Bid-Delta*Point;
     res=OrderSend(Symbol(),OP_SELLSTOP,Lot(),fND(price),Slip,fND(price+Delta*Point),fND(price-Delta*Point),"",MAGIC,0,Red);
      if(res<0)
        {
         Print("Ошибка: ",GetLastError());
         err++;
         Sleep(500);
         RefreshRates();
        }
      else
         Print("OK Order SELLSTOP");     
    }
   if (err>Try) return;  
  }
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del; 
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
        {
         if (OrderType()==OP_BUYSTOP)  del=OrderDelete(OrderTicket()); 
         if (OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());       
        }
      }
    }     
  }
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
        {
         if(OrderType()==OP_BUY || OrderType()==OP_SELL)
          count++;
        }
      }
    }
    return(count);
  }
//+------------------------------------------------------------------+
double fND(double d,int n=-1)
  {
   if(n<0) return(NormalizeDouble(d, Digits));
   return(NormalizeDouble(d, n));
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double Lot()
  {  
   if(OrdersHistoryTotal()==0)
    {
     lot=Lots;
    }             
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))      
     {                                       
      if(OrderProfit()>0)                     
       {
        lot=Lots;  
       }
      if(OrderProfit()<=0)
        {
         lot=OrderLots()*2;  
        }
     }
    if(lot>MaxLot)lot=MaxLot;            
   return(lot);
  } 
//+------------------------------------------------------------------+
void ClosePos()
  {
   tickvol=MarketInfo(Symbol(),MODE_TICKVALUE);
//---
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=Symbol()) continue;
      //--- check order type 
      if(OrderType()==OP_BUY)
        {
         if(tickvol>=TickVol)
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slip,White))
               Print("OrderClose error ",GetLastError());
           }
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(tickvol>=TickVol)
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slip,White))
               Print("OrderClose error ",GetLastError());
           }
         break;
        }
     }
//---
  }  
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- check for trading
   if(IsTradeAllowed()==false)
      return;
     tickvol=MarketInfo(Symbol(),MODE_TICKVALUE);
     if(CountTrades()<1)PutOrder();
     if(CountTrades()>0)DelOrder();
     if(TickVol>0) ClosePos();
     Comment("\nTick Volume: ",tickvol);   
//---
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 15 декабря 2014, 22:11
+1
Восстановил примерно. Было что то подобное:



Файл в базе: www.opentraders.ru/downloads/530/
avatar

AM2

  • 15 декабря 2014, 21:44
0
Как показала практика нужно сохранять промежуточные версии в коментариях.


//+------------------------------------------------------------------+
//|                                                    StopLimit.mq4 |
//|                                              Copyright 2014, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

#define MAGIC  20110406
/*
1. Выставляем по одному стоповому или лимитному ордеру на расстоянии от цены.
2. Если сработал бай и закрылся по ТП на его место ставим селл стоп.
3. Если сработал бай и закрылся по СЛ на его место ставим ???.
4. Если сработал селл и закрылся по ТП на его место ставим бай стоп.
5. Если сработал селл и закрылся по СЛ на его место ставим ???.
*/
extern int    StopLoss    = 2500;//Стоплосс ордера
extern int    TakeProfit  = 350; //Тейкпрофит ордера 
extern int    Distance    = 350; //Расстояние от цены для установки ордера
extern int    Step        = 400; //Шаг установки ордеров
extern int    Count       = 10;  //Количество устанавливаемых ордеров
extern int    StopLimit   = 1;   //0 - Только стоповые ордера, 1 - только лимитные
extern int    Expiration  = 44;  //Время истечения ордера
extern int    KLot        = 50;  //Коэффициент у величения лота
extern double Lots        = 0.1; //Лот
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   Comment("");      
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   datetime expiration = TimeCurrent()+3600*Expiration;
   int Pos=0,b=0,s=0,res,i;
   double price;  
   for(i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i, SELECT_BY_POS))
      {  
       if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=MAGIC) continue;
       if (OrderType()==OP_BUYLIMIT) b++;
       if (OrderType()==OP_SELLLIMIT) s++;
       if (OrderType()==OP_BUYSTOP) b++;
       if (OrderType()==OP_SELLSTOP) s++;       
       if (OrderType()==OP_BUY) Pos++;
       if (OrderType()==OP_SELL) Pos++;                  
      }   
    }
    
   if(LastDealResult()==1 && LastDealType()==1 && Pos<1 && b<1 && s<1)       
    { 
     for(i=1;i<=Count*KLot;i++)
      {
       {      
        price=LastDealPrice();           
        res=OrderSend(Symbol(),OP_SELLSTOP,Lots*KLot,price,3,price+StopLoss*Point,price-TakeProfit*Point,"",MAGIC,expiration,Red);
        Pos++;    
        Sleep(1000);
      }
     }
    }
    
   if(LastDealResult()==1/*last sell*/ && LastDealType()==2 && Pos<1 && b<1 && s<1)       
    { 
     for(i=1;i<=Count*KLot;i++)
      {
       {       
        price=LastDealPrice();           
        res=OrderSend(Symbol(),OP_BUYSTOP,Lots*KLot,price,3,price-StopLoss*Point,price+TakeProfit*Point,"",MAGIC,expiration,Blue);
        Pos++;   
        Sleep(1000);
       }
     }
    }          
    
   if(b<1 && s<1 && Pos<1)       
   for(i=1;i<=Count;i++)
    {
     { 
      price=fND(Ask+(Distance*Point+i*Step*Point));           
      if(StopLimit==0)res=OrderSend(Symbol(),OP_BUYSTOP,Lots,price,3,price-StopLoss*Point,price+TakeProfit*Point,"",MAGIC,expiration,Blue);
      if(StopLimit==1)res=OrderSend(Symbol(),OP_SELLLIMIT,Lots,price,3,price+StopLoss*Point,price-TakeProfit*Point,"",MAGIC,expiration,Red);     
      Sleep(1000);
     }
    }
       
   if(s<1 && b<1 && Pos<1)
   for(i=1;i<=Count;i++)
     { 
      price=fND(Bid-(Distance*Point+i*Step*Point));                  
      if(StopLimit==0) res=OrderSend(Symbol(),OP_SELLSTOP,Lots,price,3,price+StopLoss*Point,price-TakeProfit*Point,"",MAGIC,expiration,Red);
      if(StopLimit==1)res=OrderSend(Symbol(),OP_BUYLIMIT,Lots,price,3,price-StopLoss*Point,price+TakeProfit*Point,"",MAGIC,expiration,Blue);
      Sleep(1000);
     }
     
   //if(CountTrades()>0)DelOrder();
   Comment("\nLast Deal Result ",LastDealResult(),
           "\nLast Deal Type ",LastDealType(), 
           "\nLast Deal Price ",LastDealPrice(),
           "\nSell Orders Count ",s,
           "\nBuy Orders Count ",b,
           "\nPositions Count ",Pos);
   return(0);    
  }     
//+------------------------------------------------------------------+
double fND(double d, int n=-1) 
  {  
   if (n<0) return(NormalizeDouble(d, Digits)); 
   return(NormalizeDouble(d, n)); 
  }
//+------------------------------------------------------------------+
int LastDealResult()
  {
   int result=0;  
   if(OrdersHistoryTotal()==0)
    {
     result=0;
    }             
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))      
     {                                       
      if(OrderProfit()>0)                     
       {
        result=1;//tp  
       }
      if(OrderProfit()<0)
        {
         result=2;//sl  
        }
     }         
   return(result);
  }  
//+------------------------------------------------------------------+
int LastDealType()
  {
   int type=0;  
   if(OrdersHistoryTotal()==0)
    {
     type=0;
    }             
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))      
     {                                       
      if(OrderType()==OP_BUY)                     
       {
        type=1;//buy  
       }
      if(OrderType()==OP_SELL) 
        {
         type=2;//sell  
        }
     }         
   return(type);
  }  
//+------------------------------------------------------------------+
double LastDealPrice()
  {
   double price=0;  
   if(OrdersHistoryTotal()==0)
    {
     price=0;
    }             
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))      
     {                                       
      price=OrderOpenPrice();
     }         
   return(price);
  }  
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del; 
   for(int i=OrdersTotal()-1; i>=0; i--) 
    {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
       {
        if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=Symbol()) continue;
         {    
          if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
          if (OrderType()==OP_BUYSTOP)  del=OrderDelete(OrderTicket()); 
          if (OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());
          if (OrderType()==OP_BUYLIMIT)  del=OrderDelete(OrderTicket()); 
          if (OrderType()==OP_SELLLIMIT) del=OrderDelete(OrderTicket());
         }
       }                
     }         
  }
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
        {
         if(OrderType()==OP_BUY || OrderType()==OP_SELL)
          count++;
        }
      }
    }
    return(count);
  }
//+------------------------------------------------------------------+
avatar

AM2

  • 15 декабря 2014, 21:33
0
У меня не сохраняются промежуточные версии, если только в базе или в коментариях.
avatar

AM2

  • 15 декабря 2014, 20:54
0
Если закрываются несколько свечей ниже или выше машки, ставим стрелку.


www.opentraders.ru/downloads/529/
avatar

AM2

  • 15 декабря 2014, 20:40
0
Случайно затер ту версию. Теперь нужно восстанавливать, но смысл в том что после тейка по цене прошлого ордера вливаем максимальный объем серией из нескольких ордеров.
avatar

AM2

  • 15 декабря 2014, 20:15
0
Поправил. Сейчас ставит ордера при превышении указанного тикового объема и значение объема выводится в окно терминала.




//+------------------------------------------------------------------+
//|                                                        Delta.mq4 |
//|                                            Copyright © 2014, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2014, AM2"
#property link      "http://www.forexsystems.biz"
#property description "Forex expert advisor"

//--- Inputs
extern int    Delta   = 200;  // расстояние до ордера и стопы
extern int    Slip    = 30;   // проскальзывание ордера
extern int    Try     = 5;    // количество попыток выставить ордер
extern double Lots    = 0.1;  // объем позиции
extern double MaxLot  = 5;    // максимальный объем позиции
extern double TickVol = 0.5;  // тиковый объем
extern int    MAGIC   = 333;  // магик
double lot,tickvol;
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void PutOrder()
  {
   int    res,b,s,err;
   double price;
   tickvol=iVolume(Symbol(),0,0);   
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
        {
         if(OrderType()==OP_BUYSTOP)b++;
         if(OrderType()==OP_SELLSTOP)s++; 
        }
      }
    }
    
   //--- buy
   if(tickvol>=TickVol && b<1)
    {
     price=Ask+Delta*Point;
     res=OrderSend(Symbol(),OP_BUYSTOP,Lot(),fND(price),Slip,fND(price-Delta*Point),fND(price+Delta*Point),"",MAGIC,0,Blue);
      if(res<0)
        {
         Print("Ошибка: ",GetLastError());
         err++;
         Sleep(500);
         RefreshRates();
        }
      else
         Print("OK Order BUYSTOP");     
    }             
                    
   //--- sell 
   if(tickvol>=TickVol && s<1)
    {
     price=Bid-Delta*Point;
     res=OrderSend(Symbol(),OP_SELLSTOP,Lot(),fND(price),Slip,fND(price+Delta*Point),fND(price-Delta*Point),"",MAGIC,0,Red);
      if(res<0)
        {
         Print("Ошибка: ",GetLastError());
         err++;
         Sleep(500);
         RefreshRates();
        }
      else
         Print("OK Order SELLSTOP");     
    }
   if (err>Try) return;  
  }
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del; 
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
        {
         if (OrderType()==OP_BUYSTOP)  del=OrderDelete(OrderTicket()); 
         if (OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());       
        }
      }
    }     
  }
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
        {
         if(OrderType()==OP_BUY || OrderType()==OP_SELL)
          count++;
        }
      }
    }
    return(count);
  }
//+------------------------------------------------------------------+
double fND(double d,int n=-1)
  {
   if(n<0) return(NormalizeDouble(d, Digits));
   return(NormalizeDouble(d, n));
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double Lot()
  {  
   if(OrdersHistoryTotal()==0)
    {
     lot=Lots;
    }             
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))      
     {                                       
      if(OrderProfit()>0)                     
       {
        lot=Lots;  
       }
      if(OrderProfit()<=0)
        {
         lot=OrderLots()*2;  
        }
     }
    if(lot>MaxLot)lot=MaxLot;            
   return(lot);
  } 
//+------------------------------------------------------------------+
void ClosePos()
  {
   tickvol=MarketInfo(Symbol(),MODE_TICKVALUE);
//---
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=Symbol()) continue;
      //--- check order type 
      if(OrderType()==OP_BUY)
        {
         if(tickvol>=TickVol)
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slip,White))
               Print("OrderClose error ",GetLastError());
           }
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(tickvol>=TickVol)
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slip,White))
               Print("OrderClose error ",GetLastError());
           }
         break;
        }
     }
//---
  }  
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- check for trading
   if(IsTradeAllowed()==false)
      return;
     tickvol=MarketInfo(Symbol(),MODE_TICKVALUE);
     if(CountTrades()<1)PutOrder();
     if(CountTrades()>0)DelOrder();
     //if(TickVol>0) ClosePos();
     Comment("\nTick Volume: ",tickvol);   
//---
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 15 декабря 2014, 17:08
0
Поправил. Сейчас ставит ордера при превышении указанного тикового объема и значение объема выводится в окно терминала.

avatar

AM2

  • 15 декабря 2014, 16:50
0
Поставил советник на 3 пары. Когда поправлю сообщу.
avatar

AM2

  • 15 декабря 2014, 16:36
0
сделаю. немного осталось
avatar

AM2

  • 15 декабря 2014, 16:09
0
Вот посмотрите вариант:


//+------------------------------------------------------------------+
//|                                                        Delta.mq4 |
//|                                            Copyright © 2014, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2014, AM2"
#property link      "http://www.forexsystems.biz"
#property description "Forex expert advisor"

//--- Inputs
extern int    Delta   = 200;  // расстояние до ордера и стопы
extern int    Slip    = 30;   // проскальзывание ордера
extern int    Try     = 5;    // количество попыток выставить ордер
extern double Lots    = 0.1;  // объем позиции
extern double MaxLot  = 5;    // максимальный объем позиции
extern double TickVol = 0.5;  // тиковый объем
extern int    MAGIC   = 333;  // магик
double lot;
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void PutOrder()
  {
   int    res,b,s,err;
   double price;
   double tickvol=MarketInfo(Symbol(),MODE_TICKVALUE);   
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
        {
         if(OrderType()==OP_BUYSTOP)b++;
         if(OrderType()==OP_SELLSTOP)s++; 
        }
      }
    }
    
   //--- buy
   if(tickvol>=TickVol && b<1)
    {
     price=Ask+Delta*Point;
     res=OrderSend(Symbol(),OP_BUYSTOP,Lot(),fND(price),Slip,fND(price-Delta*Point),fND(price+Delta*Point),"",MAGIC,0,Blue);
      if(res<0)
        {
         Print("Ошибка: ",GetLastError());
         err++;
         Sleep(500);
         RefreshRates();
        }
      else
         Print("OK Order BUYSTOP");     
    }             
                    
   //--- sell 
   if(tickvol>=TickVol && s<1)
    {
     price=Bid-Delta*Point;
     res=OrderSend(Symbol(),OP_SELLSTOP,Lot(),fND(price),Slip,fND(price+Delta*Point),fND(price-Delta*Point),"",MAGIC,0,Red);
      if(res<0)
        {
         Print("Ошибка: ",GetLastError());
         err++;
         Sleep(500);
         RefreshRates();
        }
      else
         Print("OK Order SELLSTOP");     
    }
   Comment("\nTick Volume ",tickvol);
   if (err>Try) return;  
  }
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del; 
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
        {
         if (OrderType()==OP_BUYSTOP)  del=OrderDelete(OrderTicket()); 
         if (OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());       
        }
      }
    }     
  }
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
        {
         if(OrderType()==OP_BUY || OrderType()==OP_SELL)
          count++;
        }
      }
    }
    return(count);
  }
//+------------------------------------------------------------------+
double fND(double d,int n=-1)
  {
   if(n<0) return(NormalizeDouble(d, Digits));
   return(NormalizeDouble(d, n));
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double Lot()
  {  
   if(OrdersHistoryTotal()==0)
    {
     lot=Lots;
    }             
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))      
     {                                       
      if(OrderProfit()>0)                     
       {
        lot=Lots;  
       }
      if(OrderProfit()<=0)
        {
         lot=OrderLots()*2;  
        }
     }
    if(lot>MaxLot)lot=MaxLot;            
   return(lot);
  } 
//+------------------------------------------------------------------+
void ClosePos()
  {
   double tickvol=MarketInfo(Symbol(),MODE_TICKVALUE);
//---
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=Symbol()) continue;
      //--- check order type 
      if(OrderType()==OP_BUY)
        {
         if(tickvol>=TickVol)
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slip,White))
               Print("OrderClose error ",GetLastError());
           }
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(tickvol>=TickVol)
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slip,White))
               Print("OrderClose error ",GetLastError());
           }
         break;
        }
     }
//---
  }  
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false)
      return;
    
     if(CountTrades()<1)PutOrder();
     if(CountTrades()>0)DelOrder();
     //if(TickVol>0) ClosePos();   
//---
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 14 декабря 2014, 19:38
+1
последняя просьба ))

Почему последняя?
Чем больше сдадим, тем лучше. (С) Хмырь. «Джентельмены удачи».
avatar

AM2

  • 14 декабря 2014, 19:16
+1
В принципе уже сейчас неплохо идет *victory* 

avatar

AM2

  • 14 декабря 2014, 17:01
+1
Доработал. Обновил советник в базе: www.opentraders.ru/downloads/519/
Завтра поставлю на демо.
avatar

AM2

  • 14 декабря 2014, 14:34
+1
Как сделать sms оповещение о почте, абсолютно бесплатным, на любом электронном почтовом ящике,

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

Нашел на хабре такой не мудреный скрипт вот код:

function my_notification() 
{
  var calendar = CalendarApp.getOwnedCalendarsByName('email')[0]; //открываем календарь с именем "email"

  var threads = GmailApp.getUserLabelByName('SMSnotify').getThreads();  //переменная, в которой хранится коллекция цепочек с ярлыком SMSnotify
  var now = new Date();

  if(threads == 0) return; // прекращение выполнения, если новых цепочек нет

  for(i in threads) // создаем события
  {
    calendar.createEvent(threads[i].getFirstMessageSubject(),
        new Date(now.getTime()+60000),
        new Date(now.getTime()+60000));
  }

  GmailApp.getUserLabelByName('SMSnotify').removeFromThreads(threads); //снимаем метки "SMSnotify" с цепочек
}


мне вот этот вариант понравился больше

function SMSki() 
{
  var calendar = CalendarApp.getOwnedCalendarsByName('SMS')[0];
  if (!calendar){
    calendar = CalendarApp.createCalendar('SMS');
    calendar.setHidden(true);
  }
  
  var label = GmailApp.getUserLabelByName('sms');
  var threads = label.getThreads();
  var now = new Date();

  if(threads == 0) return; // прекращение выполнения, если новых цепочек нет
  
  for(i in threads) // создаем события
  {
    calendar.createEvent('EMAIL '+threads[i].getFirstMessageSubject(),
        new Date(now.getTime()+60000),
        new Date(now.getTime()+60000)).addSmsReminder(0);
  }
    
  label.removeFromThreads(threads); //снимаем метки "sms"
}

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

не забываем прописать триггер, время указываем на свое усмотрение как часто проверять папку на письма.

Статья habrahabr.ru/post/145447/
avatar

AM2

  • 14 декабря 2014, 08:55
+1
Как настроить почтовые уведомления в Metatrader 4



Пример реализации отправки сообщений на мобильник:

Хочу поделиться темой для получения оповещений о изменениях, происходящих на вашем счету в MT4 пока вы находитесь не у компа.

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

Заходим: Сервис > Настройки > Почта ставим галку «Разрешить»,
Сервер SMTP > smtp.yandex.ru:25,
SMTP логин > логин почты на яндексе, SMTP пароль > пароль почты на яндексе, От кого > логин@yandex.ru, Кому > логин@mail.ru.

Для получения почты в графе «Кому», создал почтовый ящик на mail.ru. В своей почте на mail.ru настроил бесплатные СМС уведомления на свой мобильник.

Для отправки сообщений из терминала использовал Кимовский советник e-SignalOfTrade. При получении СМС на мобильник смотрю изменения на счете в почте по полученному в СМС URL или захожу в почту mail.ru через MobileAgent . На mail.ru есть ограничения по количеству СМСок, поэтому для пипсовщиков с большим количеством ордеров эта тема не очень актуальна.

avatar

AM2

  • 14 декабря 2014, 08:37
+2
Покажите памм или реальный счет в плюсе по этой стратегии, тогда будет дополнительный стимул.
avatar

AM2

  • 13 декабря 2014, 23:42