Ваши вопросы по языку MQL4

AlexeyVik

Программист mql4 mql5
привет
у меня такая проблема\ я написал советника работающий по гистограме индикатора\ как мне написать код чтобы он откпывал одну сделку допустим в бай и после етого не отрывал снова в бай а дождался сигнала села и отрыл бы селл\ а то он после того как закрывает один ордер\тогда и же открывает в том же направление\ мне не надо так
помогите пож

ребят помогите пожалуйста
Ну так покажи что написал. Как можно что-то посоветовать не видя в чём у тебя ошибка.
Можно конечно попытаться потелепатить, но это не всегда получается.
 
  • Like
Реакции: gush

djasper

Интересующийся
Помогите исправит фунцию мартина в сове
Код:
//------------------------------------------------------------------
#property copyright "www.forex-tsd.com"
//------------------------------------------------------------------
//
//-----------------------условия марина------------------------
extern double LotSize = 1.0;                	// Величина торгуемого лота
extern bool MM = true;                    // использовать ли мартингейл
extern double LotExponent = 7;            // на сколько умножать убыточный лот
extern int LotExponentStart = 1;          // после какой по счёту убыточной сделки включать мартингейл
extern int LotExponentMax = 3;            // сколько раз умножать лот
//-------------------------------------------------------------------
extern int ma1per=5;
extern int ma2per=20;
extern int ma3per=50;
extern int ma4per=50;

extern string Name_Expert       = "Rsi Trader";
extern bool   UseAutoMagic      = true;
extern int    ManualMagic       = 28282828;  
extern double StopLoss         = 100;
extern double TakeProfit       = 100;
extern int    Slippage          = 5;
extern double Lots              = 0.1;
extern double MaximumRisk       = 0;
extern double DecreaseFactor    = 3;
//
bool dummyResult;
string s_symbol;

int    MAGIC;
int digit,STOPLEVEL; 

double point = 1;

//
int init() 
{
  s_symbol = Symbol();
  
  digit = MarketInfo(s_symbol,MODE_DIGITS);
  if (digit==2 || digit==4) point = 1;
  if (digit==3 || digit==5) point = 10;
  if (digit==6)             point = 100;
  
  if (UseAutoMagic) MAGIC = ManualMagic;
              else  MAGIC = ManualMagic;  
              
return(0);
}

//
//

int start()
{
  double ma1 = iMA (NULL,0,ma1per,0,MODE_EMA,PRICE_CLOSE,1);
  double ma2 = iMA (NULL,0,ma2per,0,MODE_EMA,PRICE_CLOSE,1);
  double ma3 = iMA (NULL,0,ma3per,0,MODE_EMA,PRICE_CLOSE,1);
  double ma4 = iMA (NULL,0,ma4per,0,MODE_EMA,PRICE_CLOSE,1);
   //
   if (!ExistPositions())
   {
      
     if(ma1<ma2 && ma2>ma3 && ma3>ma4 )  
     {
       OpenBuy();
       return(0);
     }

     if(ma1>ma2 && ma2<ma3 && ma3<ma4 )
     {
       OpenSell();
       return(0);
     }
      
   }
  
return (0);
}

//
bool ExistPositions() {
	for (int i=0; i<OrdersTotal(); i++) {
		if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
			if (OrderSymbol() == s_symbol && OrderMagicNumber() == MAGIC) {
				return(true);
			}
		} 
   }
return(false);
}

//
void OpenBuy() 
{ 
    
   double lbStop = 0; if (StopLoss>0)   lbStop = NormalizeDouble(Ask-StopLoss  *Point*point,digit);
   double lbTake = 0; if (TakeProfit>0) lbTake = NormalizeDouble(Ask+TakeProfit*Point*point,digit);
  
    dummyResult = OrderSend(s_symbol,OP_BUY,LotsOptimized(StopLoss),NormalizeDouble(Ask,Digits),Slippage,lbStop,lbTake,Name_Expert,MAGIC,0); 
  
    }		       

void OpenSell() 
{ 
   double lsStop = 0; if (StopLoss>0)   lsStop = NormalizeDouble(Bid+StopLoss  *Point*point,digit);
   double lsTake = 0; if (TakeProfit>0) lsTake = NormalizeDouble(Bid-TakeProfit*Point*point,digit);
   
   dummyResult = OrderSend(s_symbol,OP_SELL,LotsOptimized(StopLoss),NormalizeDouble(Bid,Digits),Slippage,lsStop,lsTake,Name_Expert,MAGIC,0); 
   
} 


//
double LotsOptimized(double stopLoss)
{
   double lot_min  = MarketInfo(s_symbol,MODE_MINLOT);
   double lot_max  = MarketInfo(s_symbol,MODE_MAXLOT);
   double lot_step = MarketInfo(s_symbol,MODE_LOTSTEP);
   double contract = MarketInfo(s_symbol,MODE_LOTSIZE);
   double lot      = Lots;
   int    orders   = HistoryTotal();     // history orders total
   int    losses   = 0;                  // number of losses orders without a break
   
   //
   //
   //
   //
   //
   
   if(lot_min < 0.0 || lot_max <= 0.0 || lot_step <= 0.0) 
   {
      Print("CalculateVolume: invalid MarketInfo() results [",lot_min,",",lot_max,",",lot_step,"]");
      return(0);
   }
   if(AccountLeverage()<=0)
   {
      Print("CalculateVolume: invalid AccountLeverage() [",AccountLeverage(),"]");
      return(0);
   }
   
   //
   //
   //
   //
   //
   
   if (MaximumRisk > 0 && stopLoss>0)
   {
      double pipMultiplier=1;
      int tdigit  = MarketInfo(s_symbol,MODE_DIGITS);
         if (tdigit==2 || tdigit==4) pipMultiplier = 1;
         if (tdigit==3 || tdigit==5) pipMultiplier = 10;
         if (tdigit==6)              pipMultiplier = 100;
      double _point = MarketInfo(s_symbol,MODE_POINT);
         lot = AccountFreeMargin()*(MaximumRisk/100.0)/(stopLoss*pipMultiplier*MarketInfo(s_symbol,MODE_TICKVALUE));
   }
   
   //+++++++++++++++++++++++++++++++++мартин надо исправить +++++++++++++++++++++++++++++++++++++++++++
   if (MM)
  {
     lots = LotSize;
     int ct = 0;
     for (int c=1;c<=OrdersTotal();c++)
     {
        OrderSelect(OrdersTotal()-c,SELECT_BY_POS,MODE_TRADES);
        if (OrderMagicNumber() != MAGIC) continue;
        ct+=1; break;
     }

     if (ct == 0)
     {
        int clt = 0;
        for (int co=1;co<=OrdersHistoryTotal();co++)
        {
           OrderSelect(OrdersHistoryTotal()-co,SELECT_BY_POS,MODE_HISTORY);
           if (OrderMagicNumber() != MAGIC) continue;
           if (OrderProfit() < 0) { clt+=1; if (clt < LotExponentStart+LotExponentMax) { lot = OrderLots(); } } else break;
        }

        if (clt >= LotExponentStart && LotExponentMax != 0)
        {
           clt = 0;
           int mult = 0;
           for (int co2=1;co2<=OrdersHistoryTotal();co2++)
           {
              OrderSelect(OrdersHistoryTotal()-co2,SELECT_BY_POS,MODE_HISTORY);
              if (OrderMagicNumber() != MAGIC) continue;
              if (OrderProfit() < 0) { clt+=1; if (clt >= LotExponentStart) { lot*=LotExponent; mult+=1; } }
              if (OrderProfit() >= 0) break;
           }
           if (mult <= LotExponentMax) lots = lot;
        }
     }
  }
  //+++++++++++++++++ конец мартина ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   
   if(DecreaseFactor>0)
   {
      for(int i=orders-1;i>=0;i--)
      {
        if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
        if(OrderSymbol()!= s_symbol || OrderType() > OP_SELL) continue;
      
        //
        //
        //
        //
        //
      
        if(OrderProfit() > 0) break;
        if(OrderProfit() < 0) losses++;
        }
        if(losses>1) lot=NormalizeDouble(lot - lot * losses/DecreaseFactor,2);
   }
   
   //
   //
   //
   //
   //
   
   lot=NormalizeDouble(lot/lot_step,0)*lot_step;
   if(lot<lot_min) lot=lot_min;
   if(lot>lot_max) lot=lot_max;
return(lot);
} 

//*******************************************
 

gush

бродяга
Ну тогда держи готовый, бродяга. У меня сегодня опять день добрых дел.
если allMagic = true то сов будет работать со всеми магиками
если Magic = 0 и allMagic = false то сов будет работать только с ордерами открытыми вручную и открытыми любым методом с магиком 0.

Спасибо Алексей.. вопросик..
выставляются ордера только один раз?
Проверил так.. открыл ордер бай с тп/сл, он по стопу отработал и сразу появился стоповый как и хотелось.. с теми же параметрами..
Сразу удалил этот стоповый в ручную в ожидании что сов это заметит и снова поставит такой же, а нет.. ничего больше не ставится..
 

RoboMaks

Элитный участник
Вот именно... Либо подстраиваться каждый раз, либо учитывать возможные изменения и стараться сделать так, чтобы не пришлось править и переписывать код.

Ну - всех возможных изменений в любом случае не учтёшь... На форум MQL заходить страшно... Одни ошибки исправляются - другие создаются.. От билда 600 уже 890... и это ещё не конец :) а могут и вообще движок МТ4 отключить.
 
  • Like
Реакции: gush

AlexeyVik

Программист mql4 mql5
Спасибо Алексей.. вопросик..
выставляются ордера только один раз?
Проверил так.. открыл ордер бай с тп/сл, он по стопу отработал и сразу появился стоповый как и хотелось.. с теми же параметрами..
Сразу удалил этот стоповый в ручную в ожидании что сов это заметит и снова поставит такой же, а нет.. ничего больше не ставится..
Это как-же, вашу мать,
извиняюсь понимать
Л. Филатов Про Федота стрельца.

Закрыли руками открытый - всеравно восстановить!!!
Кроме отложек! Они мешать будут, в смысле, если отложку удалили (несработавшую-любую) их не хотелось бы воскрешать))) Реально???? Будут погрешности???
Или я что-то не так умею читать?:D
Но учитывайте, что это сырой вариант советника и если ордер будет закрыт ближе стоплевела, то возможна ошибка исполнения. Ошибки никак не обрабатываются.
Ещё ответ на вопрос: Если ордер закрылся, поставился стоповый или лимитный, потом он активировался и тоже был закрыт, то на этом месте вновь будет открыт стоповый или лимитный ордер в зависимости от того как закрылся этот ордер.
 
Последнее редактирование:
  • Like
Реакции: gush

AlexeyVik

Программист mql4 mql5
Ну - всех возможных изменений в любом случае не учтёшь... На форум MQL заходить страшно... Одни ошибки исправляются - другие создаются.. От билда 600 уже 890... и это ещё не конец :) а могут и вообще движок МТ4 отключить.
Так и я о том-же...
Всех денег не заработаешь и всех женщин не перецелуеш но к этому стремиться надо.
Так-же и в этом случае, всех возможных изменений не учтёшь, но надо стараться их предупреждать.
 

gush

бродяга
Это как-же, вашу мать,
извиняюсь понимать
Л. Филатов Про Федота стрельца.


Или я что-то не так умею читать?:D

отложки не срабатавшие-удаленные - да :D

но тут Алексей, такая ситуация, открытый ордер закрылся - получили отложку на его место. Я ее руками удалил, чтобы проверить алгоритм.. но ведь на этом месте был открытый ордер и он у нас есть в истории.. как то так..
 

gush

бродяга
Это как-же, вашу мать,
извиняюсь понимать
Л. Филатов Про Федота стрельца.


Или я что-то не так умею читать?:D
Но учитывайте, что это сырой вариант советника и если ордер будет закрыт ближе стоплевела, то возможна ошибка исполнения. Ошибки никак не обрабатываются.
Ещё ответ на вопрос: Если ордер закрылся, поставился стоповый или лимитный, потом он активировался и тоже был закрыт, то на этом месте вновь будет открыт стоповый или лимитный ордер в зависимости от того как закрылся этот ордер.

нет, цена на одном уровне стояла, стоповый ордер мог бы поставиться...
еще раз огромнейшее спасибо,
Алексей, буду тестировать, еще вопрос, один ордер закрытый по одной цене будет постоянно воскрешаться?
Например цена бай 1.3000 тейк=10п.
цена 1.3010 - ордер закрывается - ставится отложка 1.3000
флет, цена качается 10п. вверх - 10п. вниз...
ордер по одной этой цене постоянно будет возрождаться? Бесконечный цикл?
 

AlexeyVik

Программист mql4 mql5
отложки не срабатавшие-удаленные - да :D

но тут Алексей, такая ситуация, открытый ордер закрылся - получили отложку на его место. Я ее руками удалил, чтобы проверить алгоритм.. но ведь на этом месте был открытый ордер и он у нас есть в истории.. как то так..
А не боишься с таким советником забить МТ ордерами до безумия?
Удалил отложку, значит здесь ордера не должно быть. Иначе алгоритм многократно усложняется и в рамки добрых дел не входит. Ведь надо как-то описать при каких обстоятельствах надо восстанавливать ордер, а в каких не надо.

нет, цена на одном уровне стояла, лимитка могла бы поставиться...
еще раз огромнейшее спасибо,
Алексей, буду тестировать, еще вопрос, один ордер закрытый по одной цене будет постоянно воскрешаться?
Например цена бай 1.3000 тейк=10п.
цена 1.3010 - ордер закрывается - ставится отложка 1.3000
флет, цена качается 10п. вверх - 10п. вниз...
ордер по одной этой цене постоянно будет возрождаться? Бесконечный цикл?

Да. Пока не удалишь отложку.
 
  • Like
Реакции: gush

edvinascavadimasca

Интересующийся
extern double Lots = 0.01;
extern int TakeProfit = 15;
extern int StopLoss = 15;
extern int Slippage = 5;
extern int Magic = 1111;
extern string comment = "Nistrean";
extern string Indicator = " Indicator";
extern int period = 25;

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

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(Digits == 3 || Digits ==5)
{
TakeProfit *=10;
StopLoss *=10;
Slippage *=10;
}
return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---

}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
int start()
{
PriceHigh = iCustom(Symbol(), 0, "Fisher_Yur4ik", period, 1, 1);
PriceLow = iCustom(Symbol(), 0, "Fisher_Yur4ik", period, 2, 1);

if (PriceHigh > 0 && CountBuy() == 0)
{
SL = NormalizeDouble(Ask - StopLoss * Point, Digits);
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, Magic, 0);
if(ticket > 0)
{
if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
{
OrderModify(ticket, OrderOpenPrice(), SL, TP, 0, Blue);
}

}

if(PriceHigh > 0 && CountSell() > 0)
{
for (int i=OrdersTotal() -1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)== true)
{
if (OrderMagicNumber()== Magic && OrderType()== OP_SELL )
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black);
}

}
}

return(0);

}


if(PriceLow < 0 && CountSell() == 0)
{
SL = NormalizeDouble(Bid + StopLoss * Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0);
if(ticket > 0)
{
if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
{
OrderModify(ticket, OrderOpenPrice(), SL, TP, 0, Red);
}
}

}
if(PriceLow < 0 && CountBuy() > 0)
{
for (int i=OrdersTotal() -1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true)
{
if (OrderMagicNumber()== Magic && OrderType()== OP_BUY )
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black);
}

}
}

return(0);




}



//+------------------------------------------------------------------+






int CountSell()
{
int count = 0;
for(int trade = OrdersTotal()-1; trade >=0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if(OrderType() == OP_SELL)
count ++;
}
}
return(count);
}


int CountBuy()
{
int count = 0;
for(int trade = OrdersTotal()-1; trade >=0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if(OrderType() == OP_BUY)
count ++;
}
}



return(count);

}

вот весь код
 

gush

бродяга
А не боишься с таким советником забить МТ ордерами до безумия?
нет, если ордер еще не закрыт ведь ставиться ничего не будет, а вот если закрылся - ставим..

Кстати Алексей, чисто из любопытства хотел спросить, сегодня весь день у меня крутился алгоритм по воскрешению ордеров..
а вот такое возможно, брать инфу из текстового файла куда просто тупо записывать любым форматом лот/цена/тп/сл построчно и проверять есть ли ордера из этого файла, если какого то нет - ставим... ))) тоже как вариант..
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
1. Можно завести булеву переменную, проверять её значение и переключать при открытии ордера.
2. Судя по коду, важным является пересечение нулевого уровня индикатора. Так вот и прочти значение не только на первом баре, но и на втором. Тогда будет условие (на первом баре < 0 && на втором баре > 0)
Для меня второй вариант предпочтительней. (не спрашивай почему).
 
  • Like
Реакции: gush

edvinascavadimasca

Интересующийся
а как написать ето условие (на первом баре < 0 && на втором баре > 0) ?? имено код
спасибо заранее
 

AlexeyVik

Программист mql4 mql5
нет, если ордер еще не закрыт ведь ставиться ничего не будет, а вот если закрылся - ставим..

Кстати Алексей, чисто из любопытства хотел спросить, сегодня весь день у меня крутился алгоритм по воскрешению ордеров..
а вот такое возможно, брать инфу из текстового файла куда просто тупо записывать любым форматом лот/цена/тп/сл построчно и проверять есть ли ордера из этого файла, если какого то нет - ставим... ))) тоже как вариант..
В принципе приемлемый вариант, но с определёнными заморочками. Не исключён вариант ошибки при записи и соответственно ошибки исполнения. Я думаю проще поставить отложку куда душа пожелает и пусть сов восстанавливает её, после активации и закрытия, пока цена болтается в этом диапазоне. Ну а если нужно разделить по магику, то открыть можно скриптом с магиком. В сети таких скриптов навалом.
 
  • Like
Реакции: gush

gush

бродяга
В принципе приемлемый вариант, но с определёнными заморочками. Не исключён вариант ошибки при записи и соответственно ошибки исполнения. Я думаю проще поставить отложку куда душа пожелает и пусть сов восстанавливает её, после активации и закрытия, пока цена болтается в этом диапазоне. Ну а если нужно разделить по магику, то открыть можно скриптом с магиком. В сети таких скриптов навалом.

в смысле записывать в текстовый файл руками какие нужны ордера, а не совой..
с утреца один раз записать нужную сеточку... ииии.. пусть весь день стоит на смерть :D
 

AlexeyVik

Программист mql4 mql5
а как написать ето условие (на первом баре < 0 && на втором баре > 0) ?? имено код
спасибо заранее
Вот кусок твоего кода с исправлением для одного направления.

Код:
PriceHigh = iCustom(Symbol(), 0, "Fisher_Yur4ik", period, 1, 1);
PriceHigh2 = iCustom(Symbol(), 0, "Fisher_Yur4ik", period, 1, 2);

PriceLow = iCustom(Symbol(), 0, "Fisher_Yur4ik", period, 2, 1);
PriceLow2 = iCustom(Symbol(), 0, "Fisher_Yur4ik", period, 2, 2);
    
    if (PriceHigh > 0 && PriceHigh2 < 0 && CountBuy() == 0)
Так-же добавь и в условие для открытия Sell
 

AlexeyVik

Программист mql4 mql5
в смысле записывать в текстовый файл руками какие нужны ордера, а не совой..
с утреца один раз записать нужную сеточку... ииии.. пусть весь день стоит на смерть :D
Так у тебя-же есть скрипт ставить сетку. Поставил сетку и сов весь день и даже не один день восстанавливает её. К вечеру какого либо дня поудалял отложки, дождался закрытия последнего и открытия на его месте отложки, удалил её и занимайся переводом денег. Сов можно не снимать с графика.
На следующий день не снимая советник с чарта скриптом кидаешь сеть и снова ждёшь перечисления очередного миллиона.
 

gush

бродяга
Так у тебя-же есть скрипт ставить сетку. Поставил сетку и сов весь день и даже не один день восстанавливает её. К вечеру какого либо дня поудалял отложки, дождался закрытия последнего и открытия на его месте отложки, удалил её и занимайся переводом денег. Сов можно не снимать с графика.
На следующий день не снимая советник с чарта скриптом кидаешь сеть и снова ждёшь перечисления очередного миллиона.

да да да! Это все есть, просто идея сегодня пришла как еще можно восстанавливать нужные ордера, я на форум не заходил днем, не видел что уже сов есть, спасибо Алексей!!!! Буду пробовать
 

edvinascavadimasca

Интересующийся
я так и поставил
не показывает ошибок но вапще не отрывает ордеров

extern double Lots = 0.01;
extern int TakeProfit = 15;
extern int StopLoss = 15;
extern int Slippage = 5;
extern int Magic = 1111;
extern string comment = "Nistrean";
extern string Indicator = " Indicator";
extern int period = 25;

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

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(Digits == 3 || Digits ==5)
{
TakeProfit *=10;
StopLoss *=10;
Slippage *=10;
}
return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---

}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
int start()
{
PriceHigh = iCustom(Symbol(), 0, "Fisher_Yur4ik", period, 1, 1);
PriceHigh2 = iCustom(Symbol(), 0, "Fisher_Yur4ik", period, 1, 2);

PriceLow = iCustom(Symbol(), 0, "Fisher_Yur4ik", period, 2, 1);
PriceLow2 = iCustom(Symbol(), 0, "Fisher_Yur4ik", period, 2, 2);

if (PriceHigh > 0 && PriceHigh2 < 0 && CountBuy() == 0)
{
SL = NormalizeDouble(Ask - StopLoss * Point, Digits);
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, Magic, 0);
if(ticket > 0)
{
if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
{
OrderModify(ticket, OrderOpenPrice(), SL, TP, 0, Blue);
}

}

if(PriceHigh > 0 && PriceHigh2 < 0 && CountSell() > 0)
{
for (int i=OrdersTotal() -1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)== true)
{
if (OrderMagicNumber()== Magic && OrderType()== OP_SELL )
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black);
}

}
}

return(0);

}


if(PriceLow < 0 && PriceLow2 > 0 && CountSell() == 0)
{
SL = NormalizeDouble(Bid + StopLoss * Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0);
if(ticket > 0)
{
if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
{
OrderModify(ticket, OrderOpenPrice(), SL, TP, 0, Red);
}
}

}
if(PriceLow < 0 && PriceLow2 > 0 && CountBuy() > 0)
{
for (int i=OrdersTotal() -1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true)
{
if (OrderMagicNumber()== Magic && OrderType()== OP_BUY )
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black);
}

}
}

return(0);




}



//+------------------------------------------------------------------+






int CountSell()
{
int count = 0;
for(int trade = OrdersTotal()-1; trade >=0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if(OrderType() == OP_SELL)
count ++;
}
}
return(count);
}


int CountBuy()
{
int count = 0;
for(int trade = OrdersTotal()-1; trade >=0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if(OrderType() == OP_BUY)
count ++;
}
}



return(count);

}
 
Верх