[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 512345»
Форум Трейдеров » Скрипты Советники Индикаторы для Metatrader4/Metatrader5 » MT 4 MQL программирование, помощь. » Помощь с советником (Дополнение к существующей программе)
Помощь с советником
Дата: Четверг, 12.09.2013, 15:16 | Сообщение # 1 Написал: amidtver
Трейдер - Рядовой
Группа: Пользователи
Сообщений: 6
Награды: 0
Статус: Offline
Нужен срочно советник.
Работа не долгая, а именно:

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

После закрытия ордера BUY или SELL искал есть ли уже существующий открытый ордер на BUY на расстоянии скажем 15 пунктов от тек. цены
(этот параметр так же нужно сделать настраиваемым). Если нет такого ордера, то открываем идентичный только что закрытому ордеру.
Если ордер найден, то ищем SELL ордер. Если ордер найден на расстоянии 15 пунктов от тек. цены то ничего не делаем и открываем идентичный SELL если ордер не найден

Примечание: никаких стопов и тейкпрофитов делать не нужно. Должно быть только 2 настраиваемых параметра - тот который уже есть и тот,
который нужно дописать.

Код
extern int Profit=1;
void start()
{
int slippage=3;
int ask, bid, open;
double point;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
if (OrderType()==OP_BUY)
{
point=MarketInfo(OrderSymbol(),MODE_POINT);
if (point==0) break;
bid=MathRound(MarketInfo(OrderSymbol(),MODE_BID)/point);
open=MathRound(OrderOpenPrice()/point);
if (bid-open<Profit) continue;
OrderClose(OrderTicket(),OrderLots(),bid*point,slippage);
OrderSend(Symbol(), OP_BUY, 0.12, 1.5, 3, 0, 0, NULL, 0, 0, CLR_NONE);

}
if (OrderType()==OP_SELL)
{
point=MarketInfo(OrderSymbol(),MODE_POINT);
if (point==0) break;
ask=MathRound(MarketInfo(OrderSymbol(),MODE_ASK)/point);
open=MathRound(OrderOpenPrice()/point);
if (open-ask<Profit) continue;
OrderClose (OrderTicket(),OrderLots(),ask*point,slippage);
OrderSend(Symbol(), OP_SELL, 0.12, 1.5, 3, 0, 0, NULL, 0, 0, CLR_NONE);
}
}
}
 
Дата: Четверг, 12.09.2013, 16:13 | Сообщение # 2 Написал: expforex
Трейдер - Генералиссимус
Группа: Администраторы
Сообщений: 27
Награды: 0
Статус: Offline
Хорошо смотрите

функция которая ищет ближайший к текущей цене ордер(позицию)


Код
int DistMarketAndPos(string sy="", int op=-1, int mn=-1) {
   double d, p;
   int i, k=OrdersTotal(), r=1000000;

   if (sy=="" || sy=="0") sy=Symbol();
   p=MarketInfo(sy, MODE_POINT);
   if (p==0) if (StringFind(sy, "JPY")<0) p=0.0001; else p=0.01;
   for (i=0; i<k; i++) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
       if ((OrderSymbol()==sy) && (op<0 || OrderType()==op)) {
         if (mn<0 || OrderMagicNumber()==mn) {
           if (OrderType()==OP_BUY) {
             d=MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())/p;
             if (r>d) r=NormalizeDouble(d, 0);
           }
           if (OrderType()==OP_SELL) {
             d=MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))/p;
             if (r>d) r=NormalizeDouble(d, 0);
           }
         }
       }
     }
   }
   return(r);
}


в Вашем случае надо сделать так:


Код
OrderClose(OrderTicket(),OrderLots(),bid*point,slippage);  
OrderSend(Symbol(), OP_BUY, 0.12, 1.5, 3, 0, 0, NULL, 0, 0, CLR_NONE);
 
заменить на:

Код
double lots= OrderLots();
OrderClose(OrderTicket(),OrderLots(),bid*point,slippage);  
if(DistMarketAndPos(Symbol(),-1,-1)>Distance)OrderSend(Symbol(), OP_BUY, lots, Ask, 3, 0, 0, NULL, 0, 0, CLR_NONE);
 

Во первых - новый ордер откроется с предыдущим лотом, а не как у Вас с лотом 0.12
в вторых он откроется, потому что у вас цена грубо говоря не стояла
в третьих новый ордер откроется ТОЛЬКО если не будет на расстоянии 15 пунктов вблизи от текущей цены - никакой позиции ни бай ни селл.

полный код выглядит так:
Код
//+------------------------------------------------------------------+
extern int Profit=1;
extern int Distance=15;
//+------------------------------------------------------------------+
//|                    |
//+------------------------------------------------------------------+
void start()
   {
    int slippage=3;
    int ask,bid,open;
    double point;
    for(int i=OrdersTotal()-1; i>=0; i--)
      {
       if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
       if(OrderType()==OP_BUY)
         {
          point=MarketInfo(OrderSymbol(),MODE_POINT);
          if(point==0) break;
          bid=MathRound(MarketInfo(OrderSymbol(),MODE_BID)/point);
          open=MathRound(OrderOpenPrice()/point);
          if(bid-open<Profit) continue;
          double lots=OrderLots();
          OrderClose(OrderTicket(),OrderLots(),bid*point,slippage);
          if(DistMarketAndPos(Symbol(),-1,-1)>Distance)OrderSend(Symbol(),OP_BUY,lots,Ask,3,0,0,NULL,0,0,CLR_NONE);

         }
       if(OrderType()==OP_SELL)
         {
          point=MarketInfo(OrderSymbol(),MODE_POINT);
          if(point==0) break;
          ask=MathRound(MarketInfo(OrderSymbol(),MODE_ASK)/point);
          open=MathRound(OrderOpenPrice()/point);
          if(open-ask<Profit) continue;
          double lots2=OrderLots();
          OrderClose(OrderTicket(),OrderLots(),ask*point,slippage);

          if(DistMarketAndPos(Symbol(),-1,-1)>Distance)OrderSend(Symbol(),OP_SELL,lots2,Bid,3,0,0,NULL,0,0,CLR_NONE);
         }
      }
   }
//+------------------------------------------------------------------+
//|                    |
//+------------------------------------------------------------------+
int DistMarketAndPos(string sy="",int op=-1,int mn=-1)  
   {
    double d,p;
    int i,k=OrdersTotal(),r=1000000;

    if(sy=="" || sy=="0") sy=Symbol();
    p=MarketInfo(sy,MODE_POINT);
    if(p==0) if(StringFind(sy,"JPY")<0) p=0.0001; else p=0.01;
    for(i=0; i<k; i++)  
      {
       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))  
         {
          if((OrderSymbol()==sy) && (op<0 || OrderType()==op))  
            {
             if(mn<0 || OrderMagicNumber()==mn)  
               {
                if(OrderType()==OP_BUY)  
                  {
                   d=MathAbs(MarketInfo(sy,MODE_ASK)-OrderOpenPrice())/p;
                   if(r>d) r=NormalizeDouble(d,0);
                  }
                if(OrderType()==OP_SELL)  
                  {
                   d=MathAbs(OrderOpenPrice()-MarketInfo(sy,MODE_BID))/p;
                   if(r>d) r=NormalizeDouble(d,0);
                  }
               }
            }
         }
      }
    return(r);
   }
//+------------------------------------------------------------------+


Если честно я не увидел область применения такого эксперта. но сделал то что просили.


Мы лучшие
 
Дата: Четверг, 12.09.2013, 16:36 | Сообщение # 3 Написал: amidtver
Трейдер - Рядовой
Группа: Пользователи
Сообщений: 6
Награды: 0
Статус: Offline
Спасибо smile
 
Дата: Четверг, 12.09.2013, 16:42 | Сообщение # 4 Написал: expforex
Трейдер - Генералиссимус
Группа: Администраторы
Сообщений: 27
Награды: 0
Статус: Offline
amidtver, надеюсь помог разобраться. Спрашивайте если че.

Мы лучшие
 
Дата: Четверг, 12.09.2013, 18:30 | Сообщение # 5 Написал: amidtver
Трейдер - Рядовой
Группа: Пользователи
Сообщений: 6
Награды: 0
Статус: Offline
не, не так работает, наверное я не понятно объяснил. Я попробую сам разобраться, если не получится, спрошу тогда
 
Дата: Четверг, 12.09.2013, 18:45 | Сообщение # 6 Написал: expforex
Трейдер - Генералиссимус
Группа: Администраторы
Сообщений: 27
Награды: 0
Статус: Offline
amidtver, не так работает как хотелось?

Мы лучшие
 
Дата: Четверг, 12.09.2013, 21:34 | Сообщение # 7 Написал: amidtver
Трейдер - Рядовой
Группа: Пользователи
Сообщений: 6
Награды: 0
Статус: Offline
Я сам смог переделать. Вот код если интересно. Есть ещё пара мыслей как усовершенствовать, что бы убыток от не сработавших позиций свести к самому минимуму. Надо подумать...

Код
//+------------------------------------------------------------------+
extern int Profit=1;
extern int Distance=15;
bool raz=true;

//+------------------------------------------------------------------+
//|                    |
//+------------------------------------------------------------------+

void start()
{
if (raz==true)
{
OrderSend(Symbol(),OP_BUY,0.12,Ask,3,0,0,NULL,0,0,CLR_NONE);
OrderSend(Symbol(),OP_SELL,0.12,Bid,3,0,0,NULL,0,0,CLR_NONE);
raz=false;
}
int slippage=3;
int ask,bid,open;
double point;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
if(OrderType()==OP_BUY)
{
point=MarketInfo(OrderSymbol(),MODE_POINT);
if(point==0) break;
bid=MathRound(MarketInfo(OrderSymbol(),MODE_BID)/point);
open=MathRound(OrderOpenPrice()/point);
if(bid-open<Profit) continue;
double lots=OrderLots();
OrderClose(OrderTicket(),OrderLots(),bid*point,slippage);
if(DistMarketAndPos(Symbol(),OP_SELL,-1)>Distance)OrderSend(Symbol(),OP_SELL,lots,Bid,3,0,0,NULL,0,0,CLR_NONE);
if(DistMarketAndPos(Symbol(),OP_BUY,-1)>Distance)OrderSend(Symbol(),OP_BUY,lots,Ask,3,0,0,NULL,0,0,CLR_NONE);
}

if(OrderType()==OP_SELL)
{
point=MarketInfo(OrderSymbol(),MODE_POINT);
if(point==0) break;
ask=MathRound(MarketInfo(OrderSymbol(),MODE_ASK)/point);
open=MathRound(OrderOpenPrice()/point);
if(open-ask<Profit) continue;
double lots2=OrderLots();
OrderClose(OrderTicket(),OrderLots(),ask*point,slippage);
if(DistMarketAndPos(Symbol(),OP_SELL,-1)>Distance)OrderSend(Symbol(),OP_SELL,lots2,Bid,3,0,0,NULL,0,0,CLR_NONE);
if(DistMarketAndPos(Symbol(),OP_BUY,-1)>Distance)OrderSend(Symbol(),OP_BUY,lots2,Ask,3,0,0,NULL,0,0,CLR_NONE);
}
}
}
//+------------------------------------------------------------------+
//|                    |
//+------------------------------------------------------------------+
int DistMarketAndPos(string sy="",int op=-1,int mn=-1)
{
double d,p;
int i,k=OrdersTotal(),r=1000000;

if(sy=="" || sy=="0") sy=Symbol();
p=MarketInfo(sy,MODE_POINT);
if(p==0) if(StringFind(sy,"JPY")<0) p=0.0001; else p=0.01;
for(i=0; i<k; i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if((OrderSymbol()==sy) && (op<0 || OrderType()==op))
{
if(mn<0 || OrderMagicNumber()==mn)
{
if(OrderType()==OP_BUY)
{
d=MathAbs(MarketInfo(sy,MODE_ASK)-OrderOpenPrice())/p;
if(r>d) r=NormalizeDouble(d,0);
}
if(OrderType()==OP_SELL)
{
d=MathAbs(OrderOpenPrice()-MarketInfo(sy,MODE_BID))/p;
if(r>d) r=NormalizeDouble(d,0);
}
}
}
}
}
return(r);
}
//+------------------------------------------------------------------+
 
Дата: Пятница, 13.09.2013, 08:50 | Сообщение # 8 Написал: expforex
Трейдер - Генералиссимус
Группа: Администраторы
Сообщений: 27
Награды: 0
Статус: Offline
Поздравляю. 

Нет ничего невозможного.


Мы лучшие
 
Дата: Пятница, 13.09.2013, 14:43 | Сообщение # 9 Написал: amidtver
Трейдер - Рядовой
Группа: Пользователи
Сообщений: 6
Награды: 0
Статус: Offline
Подскажите пожалуйста, никак не выходит: Нужно прочитать файл .dat Он лежит в ...experts\files. Запомнить значение из этого файла, затем сравнить, к примеру если значение из файла равно 1, то перезаписать файл со значением 2
 
Дата: Пятница, 13.09.2013, 14:51 | Сообщение # 10 Написал: expforex
Трейдер - Генералиссимус
Группа: Администраторы
Сообщений: 27
Награды: 0
Статус: Offline
amidtver, это сложная процедура для Вас, поэтому объяснять я не знаю что : во первых какой тип файла, бинарный или текстовый - функции разные. 
что именно у Вас не получается как делаете?


Мы лучшие
 
Форум Трейдеров » Скрипты Советники Индикаторы для Metatrader4/Metatrader5 » MT 4 MQL программирование, помощь. » Помощь с советником (Дополнение к существующей программе)
Страница 1 из 512345»
Поиск: