Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1655

 
Volodymyr Zubov #:

Há dedos para o fato de que é inapropriado apenas colocar OrderSend, e depois não se preocupar com algo errado. Você sempre tem que procurar por erros.

Volodya, a pergunta era sobre outra coisa.

 
MakarFX #:

Volodya, a questão era diferente.

O que é isso?

 
Volodymyr Zubov #:

Em quê?

Dobranich)
 
MakarFX #:
Dobranich)

Você também.

 
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(CheckForOpen()==0)
     {
      if(OrderSend(Symbol(),OP_BUY,Lots(),Ask,Slip,Bid-StopLoss*Point,Ask+TakeProfit*Point,"",MagicNumber,0,Blue)) Print("BUY OK");
     }
   if(CheckForOpen()==1)
     {
      if(OrderSend(Symbol(),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss*Point,Bid-TakeProfit*Point,"",MagicNumber,0,Red)) Print("SELL OK");
     }
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
int CheckForOpen() // Открытие ордера по методу Пуриа
  {
   double malw,mas1,mas2,macd;
   int    res=-1, buy=0, sell=0;
   // Считывание параметров индикаторов 3 свечи
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,3);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,3);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,3);
   macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,3);
   if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
   if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
   // Считывание параметров индикаторов 2 свечи
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,2);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,2);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,2);
   macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,2);
   if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
   if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
   // Считывание параметров индикаторов 1 свечи
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,1);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,1);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,1);
   macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,1);
   if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
   if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
   // Считывание параметров индикаторов 0 свечи
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,0);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,0);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,0);
   macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,0);
   if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
   if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
   
   if(buy ==4) res=0;
   if(sell==4) res=1;
   return(res);
  }

Você pode me dizer como fazer para que não se abra um pedido com cada vela nova se todas as condições forem atendidas? Eu acabei de inserir este código, ele realmente começou a esperar pela confirmação de 4 velas, mas depois de abrir um pedido 1 vez (quando todas as condições são cumpridas) ele começou a abrir um pedido em todas as velas subseqüentes, se as condições persistirem, é assim que ele se parece no testador.

+ só para o caso de eu colar todo o código original, só para o caso de eu ter perdido algo importante:

#define  MagicNumber  122122
extern string s1             = "Trading options";
extern double Lot            = 0.01;    // размер лота 0 - авт.расчет
extern double StopLoss       = 40;     // стоплосс
extern double TakeProfit     = 10;     // тейкпрофит
extern double TrailStop      = 21;     // уровень без убытка
extern int    Trailing       = 0;      // трейлинг стоп 1 вкл. 0 выкл.
extern int    Breakeven      = 0;      // перенос стоп лосса в без убыток
extern string s2             = "Day & Hour";
extern int    HrStart        = 0;      // время начала торговли
extern int    HrEnd          = 23;     // время окончания торговли
extern int    Monday         = 1;      // Понедельник 1 вкд. 0 выкл.
extern int    Tuesday        = 1;      // Вторник
extern int    Wednesday      = 1;      // Среда
extern int    Thursday       = 1;      // Четверг
extern int    Friday         = 1;      // Пятница
//+------------------------------------------------------------------+
// параметры индикаторов
double MovingPeriodLw        = 5;      
double MovingPeriodS1        = 75;
double MovingPeriodS2        = 85;
double StopLevel;
double TrailStep             = 3;      // шаг трейлинг стопа
bool OrderBuy = false, OrderSell = false, Order = false, Init = true;
int timeprev = 0, Slip = 3.0;

//+------------------------------------------------------------------+
//| Init function                                                    |
//+------------------------------------------------------------------+
void OnInit()
{
   if (Digits == 3 || Digits == 5) { // Пересчет для 5-ти знаков                                                    
      TakeProfit *= 10;
      TrailStop *= 10;
      TrailStep *= 10;
      StopLoss *=10;
      Slip *=10;
   } 
   return; 
}
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()
{
   StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL); 
   
   // Определение направления пересечения мувингов
   if (Init) InitMetod(); 
   
   // Трейлинг стоп открытых позиций
   if (Trailing != 0 ) RealTrailOrder(TrailStop, TrailStep, StopLevel, MagicNumber);
   
   // Ожидание нового бара на графике
   if(timeprev == Time[0]) return;
   timeprev = Time[0];
   
   // Открытие ордера по методу Пуриа
   CheckForOpen();
}
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen() // Открытие ордера по методу Пуриа
{
   double malw,mas1,mas2,macd;
   int    res;  
   // Считывание параметров индикаторов
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,0);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,0);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,0);
   macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,0);
  
   // Проверяем положение мувмнгов
   if(malw>mas1 && malw>mas2  && OrderSell)
     {
     OrderBuy=true;
     OrderSell=false;
     Order=true;
     }
   
   if(malw<mas1 && malw<mas2  && OrderBuy)
     {
     OrderBuy=false;
     OrderSell=true;
     Order=true;
     }

   // Открываем ордер Buy
   if(macd>0 && OrderBuy && Order)
     {
     res=OrderSend(Symbol(),OP_BUY,Lots(),Ask,Slip,Bid-StopLoss*Point,Ask+TakeProfit*Point,"",MagicNumber,0,Blue);
     Order=false;
     return;
     }     
   // Открываем ордер Sell   
   if(macd<0 && OrderSell && Order)
     {
     res=OrderSend(Symbol(),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss*Point,Bid-TakeProfit*Point,"",MagicNumber,0,Red);
     Order=false;
     return;
     }
 
}  
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double Lots()  // Расчет объема лота
{
   double Lots;
   if (Lot > 0) return(Lot);
   Lots=AccountFreeMargin()/5000;
   Lots=MathMin(15,MathMax(0.01,Lots));
   if(Lots<0.1) Lots=NormalizeDouble(Lots,2);
   else 
     {
     if(Lots<1) Lots=NormalizeDouble(Lots,1);
     else       Lots=NormalizeDouble(Lots,0);
     }
   return(Lots);
}
//+------------------------------------------------------------------+
//| Init metod Puria function                                        |
//+------------------------------------------------------------------+
void InitMetod()  // Опредеоение начального пересечения мувингов
{
   double malw,mas1,mas2;
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,0);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,0);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,0);

   if((malw<=mas1 && malw>=mas2) || (malw>=mas1 && malw<=mas2))
     {
     Init=false;
     OrderBuy=true;
     OrderSell=true;
     }   
   return;
}
 
//+------------------------------------------------------------------+
// Treylingstop function                                             |
//+------------------------------------------------------------------+
   // Трейлинг стоп
void RealTrailOrder(double trstop, double trstep, double stlevel, int magic) 
{
   double openprice;
   double openstoploss;
   double calculatestoploss;
   double trailstop = MathMax(trstop, stlevel);
   for (int cmt = OrdersTotal() - 1; cmt >= 0; cmt--) 
     {
     if(OrderSelect(cmt, SELECT_BY_POS, MODE_TRADES) == TRUE) 
       {
       if(OrderMagicNumber() == magic && OrderSymbol() == Symbol()) 
         {
         openprice = OrderOpenPrice();
         openstoploss = OrderStopLoss();
         while (IsTradeContextBusy()) Sleep(500);
         RefreshRates();
         if(OrderType() == OP_BUY) 
           {
           calculatestoploss = ND(Bid - trailstop * Point);
           if((Bid > openprice + trailstop * Point) || (Breakeven == 0)) 
             {
             if(((calculatestoploss >= openstoploss + trstep * Point) && (trailstop * Point > stlevel * Point))) 
               {
               if(!OrderModify(OrderTicket(), OrderOpenPrice(), calculatestoploss, OrderTakeProfit(), 0, Blue))
                 Print("BUY OrderModify Error " + IntegerToString(GetLastError()));
               }
             }
           }
         if(OrderType() == OP_SELL) 
           {
           calculatestoploss = ND(Ask + trailstop * Point);
           if((Ask < openprice - trailstop * Point) || (Breakeven == 0)) 
             {
             if(((calculatestoploss <= openstoploss - trstep * Point) && (trailstop * Point > stlevel * Point))) 
               {
               if(!OrderModify(OrderTicket(), OrderOpenPrice(), calculatestoploss, OrderTakeProfit(), 0, Red))
                 Print("BUY OrderModify Error " + IntegerToString(GetLastError()));
               }
             }
           }
         }
       }
     }
}
//=============================================================================================================================================
double ND(double ad_0) 
{
  return (NormalizeDouble(ad_0, Digits));
}  
//нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
//
// Permission to trade in this day 
// 
//********************************************************************************************************
bool TradingDay(int hmin, int hmax) // Определение времени и дня разрешения торговли 
{ 
  bool dtrade = false; 
  switch (DayOfWeek()) 
    {
  
    case 1: // Monday
       if (Monday == 1) dtrade = true; 
       break;
    case 2: // Tuesday 
       if (Tuesday == 1) dtrade = true;
       break;
    case 3: // Wednesday
       if (Wednesday == 1) dtrade = true;
       break;     
    case 4: // Thursday
       if (Thursday == 1) dtrade = true;
       break;
    case 5: // Friday
       if (Friday == 1) dtrade = true;
       break;
    default: // 
       dtrade = false;
       break;
    }
  
  if (dtrade && !(Hour() >= hmin && Hour() <= hmax)) dtrade = true;
  return dtrade;
}
 
Arquivos anexados:
 
artem artem #:

Você pode me dizer como fazer para que não se abra um pedido com cada vela nova se todas as condições forem atendidas? Eu acabei de inserir este código, ele realmente começou a esperar pela confirmação de 4 velas, mas depois de abrir um pedido 1 vez (quando todas as condições são cumpridas) ele começou a abrir um pedido em todas as velas subseqüentes, se as condições persistirem, é assim que ele se parece no testador.

+ Só para o caso de eu ter perdido algo importante:

Preciso de controle (contador) das ordens abertas

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(CheckForOpen()==0&&CountTrade(0)==0) // Если сигнал для покупок и нет открытых покупок
     {
      if(OrderSend(Symbol(),OP_BUY,Lots(),Ask,Slip,Bid-StopLoss*Point,Ask+TakeProfit*Point,"",MagicNumber,0,Blue)) Print("BUY OK");
     }
   if(CheckForOpen()==1&&CountTrade(1)==0) // Если сигнал для продаж и нет открытых продаж
     {
      if(OrderSend(Symbol(),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss*Point,Bid-TakeProfit*Point,"",MagicNumber,0,Red)) Print("SELL OK");
     }
  }
//+----------------------------------------------------------------------------+
//| Счетчик ордеров (0)-buy (1)-sell ()-all                                    |
//+----------------------------------------------------------------------------+
int CountTrade(int ot=-1)
  {
   int count = 0;
   for(int i = OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
           {
            if(OrderType()==ot||ot<0) count++;
           }  
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
int CheckForOpen() // Открытие ордера по методу Пуриа
  {
   double malw,mas1,mas2,macd;
   int    res=-1, buy=0, sell=0;
   // Считывание параметров индикаторов 3 свечи
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,3);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,3);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,3);
   macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,3);
   if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
   if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
   // Считывание параметров индикаторов 2 свечи
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,2);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,2);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,2);
   macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,2);
   if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
   if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
   // Считывание параметров индикаторов 1 свечи
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,1);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,1);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,1);
   macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,1);
   if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
   if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
   // Считывание параметров индикаторов 0 свечи
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,0);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,0);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,0);
   macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,0);
   if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
   if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
   
   if(buy ==4) res=0;
   if(sell==4) res=1;
   return(res);
  }
 
Experimentei, sim, não mais reentradas. Mas se o Countrade o fizer, então não haverá reação a novos sinais enquanto pelo menos uma ordem estiver aberta, o que é desnecessário. Isto é, não deve haver reaberturas após a primeira vez, mas também deve haver uma entrada no pedido se o malte e/ou macd mudou de posição e de acordo com as condições é um sinal + se o sinal é confirmado 4 vezes seguidas => abrir uma posição. Se isto for adicionado ao código, então, idealmente, tudo deve estar pronto. O que mais precisa ser acrescentado para isso?
 
artem artem abrir uma posição. Se isto for adicionado ao código, então, idealmente, tudo deve estar pronto. O que mais precisa ser acrescentado para isso?
Se o distribuímos em porções, a mesma coisa acontecerá. Neste caso, todas as funções são construídas de acordo com as condições que você descreveu.
 

Tentei fazer mudanças no código da MakarFX e isto é o que tenho no momento:


#define  MagicNumber  122122
extern string s1             = "Trading options";
extern double Lot            = 0.01;    // размер лота 0 - авт.расчет
extern double StopLoss       = 40;     // стоплосс
extern double TakeProfit     = 10;     // тейкпрофит
extern double TrailStop      = 21;     // уровень без убытка
extern int    Trailing       = 0;      // трейлинг стоп 1 вкл. 0 выкл.
extern int    Breakeven      = 0;      // перенос стоп лосса в без убыток
extern string s2             = "Day & Hour";
extern int    HrStart        = 0;      // время начала торговли
extern int    HrEnd          = 23;     // время окончания торговли
extern int    Monday         = 1;      // Понедельник 1 вкд. 0 выкл.
extern int    Tuesday        = 1;      // Вторник
extern int    Wednesday      = 1;      // Среда
extern int    Thursday       = 1;      // Четверг
extern int    Friday         = 1;      // Пятница
//+------------------------------------------------------------------+
// параметры индикаторов
double MovingPeriodLw        = 5;      
double MovingPeriodS1        = 75;
double MovingPeriodS2        = 85;
double StopLevel;
double TrailStep             = 3;      // шаг трейлинг стопа
bool OrderBuy = false, OrderSell = false, Order = false, Init = true;
int timeprev = 0, Slip = 3.0;

//+------------------------------------------------------------------+
//| Init function                                                    |
//+------------------------------------------------------------------+
void OnInit()
{
   if (Digits == 3 || Digits == 5) { // Пересчет для 5-ти знаков                                                    
      TakeProfit *= 10;
      TrailStop *= 10;
      TrailStep *= 10;
      StopLoss *=10;
      Slip *=10;
   } 
   return; 
}
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()
{
   StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL); 
   
   // Определение направления пересечения мувингов
   if (Init) InitMetod(); 
   
   // Трейлинг стоп открытых позиций
   if (Trailing != 0 ) RealTrailOrder(TrailStop, TrailStep, StopLevel, MagicNumber);
   
   // Ожидание нового бара на графике
   if(timeprev == Time[0]) return;
   timeprev = Time[0];
   
   // Открытие ордера по методу Пуриа
   if(CheckForOpen()==0) // Если сигнал для покупок 
     {
      if(OrderSend(Symbol(),OP_BUY,Lots(),Ask,Slip,Bid-StopLoss*Point,Ask+TakeProfit*Point,"",MagicNumber,0,Blue)) Print("BUY OK");
     } 
   if(CheckForOpen()==1) // Если сигнал для продаж 
     {
      if(OrderSend(Symbol(),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss*Point,Bid-TakeProfit*Point,"",MagicNumber,0,Red)) Print("SELL OK");
     }
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
int CheckForOpen() // Открытие ордера по методу Пуриа
  {
   double malw,mas1,mas2,macd;
   int    res=-1, buy=0, sell=0;
   // Считывание параметров индикаторов 3 свечи (4ой)
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,3);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,3);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,3);
   macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,3);
   if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
   if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
   // Считывание параметров индикаторов 2 свечи (3ей)
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,2);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,2);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,2);
   macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,2);
   if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
   if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
   // Считывание параметров индикаторов 1 свечи (2ой)
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,1);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,1);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,1);
   macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,1);
   if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
   if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
   // Считывание параметров индикаторов 0 свечи (1ой)
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,0);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,0);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,0);
   macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,0);
   if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
   if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
   
   if(buy ==4 && OrderSell) { res=0; Order=false; OrderBuy=true; OrderSell=false; } 
   if(sell==4 && OrderBuy)  { res=1; Order=false; OrderBuy=false; OrderSell=true; }
   return(res);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double Lots()  // Расчет объема лота
{
   double Lots;
   if (Lot > 0) return(Lot);
   Lots=AccountFreeMargin()/5000;
   Lots=MathMin(15,MathMax(0.01,Lots));
   if(Lots<0.1) Lots=NormalizeDouble(Lots,2);
   else 
     {
     if(Lots<1) Lots=NormalizeDouble(Lots,1);
     else       Lots=NormalizeDouble(Lots,0);
     }
   return(Lots);
}
//+------------------------------------------------------------------+
//| Init metod Puria function                                        |
//+------------------------------------------------------------------+
void InitMetod()  // Опредеоение начального пересечения мувингов
{
   double malw,mas1,mas2;
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,0);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,0);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,0);

   if((malw<=mas1 && malw>=mas2) || (malw>=mas1 && malw<=mas2))
     {
     Init=false;
     OrderBuy=true;
     OrderSell=true;
     }   
   return;
}
 
//+------------------------------------------------------------------+
// Treylingstop function                                             |
//+------------------------------------------------------------------+
   // Трейлинг стоп
void RealTrailOrder(double trstop, double trstep, double stlevel, int magic) 
{
   double openprice;
   double openstoploss;
   double calculatestoploss;
   double trailstop = MathMax(trstop, stlevel);
   for (int cmt = OrdersTotal() - 1; cmt >= 0; cmt--) 
     {
     if(OrderSelect(cmt, SELECT_BY_POS, MODE_TRADES) == TRUE) 
       {
       if(OrderMagicNumber() == magic && OrderSymbol() == Symbol()) 
         {
         openprice = OrderOpenPrice();
         openstoploss = OrderStopLoss();
         while (IsTradeContextBusy()) Sleep(500);
         RefreshRates();
         if(OrderType() == OP_BUY) 
           {
           calculatestoploss = ND(Bid - trailstop * Point);
           if((Bid > openprice + trailstop * Point) || (Breakeven == 0)) 
             {
             if(((calculatestoploss >= openstoploss + trstep * Point) && (trailstop * Point > stlevel * Point))) 
               {
               if(!OrderModify(OrderTicket(), OrderOpenPrice(), calculatestoploss, OrderTakeProfit(), 0, Blue))
                 Print("BUY OrderModify Error " + IntegerToString(GetLastError()));
               }
             }
           }
         if(OrderType() == OP_SELL) 
           {
           calculatestoploss = ND(Ask + trailstop * Point);
           if((Ask < openprice - trailstop * Point) || (Breakeven == 0)) 
             {
             if(((calculatestoploss <= openstoploss - trstep * Point) && (trailstop * Point > stlevel * Point))) 
               {
               if(!OrderModify(OrderTicket(), OrderOpenPrice(), calculatestoploss, OrderTakeProfit(), 0, Red))
                 Print("BUY OrderModify Error " + IntegerToString(GetLastError()));
               }
             }
           }
         }
       }
     }
}
//=============================================================================================================================================
double ND(double ad_0) 
{
  return (NormalizeDouble(ad_0, Digits));
}  
//нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
//
// Permission to trade in this day 
// 
//********************************************************************************************************
bool TradingDay(int hmin, int hmax) // Определение времени и дня разрешения торговли 
{ 
  bool dtrade = false; 
  switch (DayOfWeek()) 
    {
  
    case 1: // Monday
       if (Monday == 1) dtrade = true; 
       break;
    case 2: // Tuesday 
       if (Tuesday == 1) dtrade = true;
       break;
    case 3: // Wednesday
       if (Wednesday == 1) dtrade = true;
       break;     
    case 4: // Thursday
       if (Thursday == 1) dtrade = true;
       break;
    case 5: // Friday
       if (Friday == 1) dtrade = true;
       break;
    default: // 
       dtrade = false;
       break;
    }
  
  if (dtrade && !(Hour() >= hmin && Hour() <= hmax)) dtrade = true;
  return dtrade;
}
 

Destacado é o que eu tentei acrescentar de mim. Como resultado, tudo funciona como deveria, mas os negócios são abertos somente na compra. Como faço para que seja aberto para venda também, quem sabe?

 
artem artem #:

Tentei fazer mudanças no código da MakarFX e isto é o que tenho no momento:


Destacado é o que eu tentei acrescentar de mim. Como resultado, tudo funciona como deveria, mas os negócios são abertos somente na compra. Como faço para que seja aberto para venda também, quem sabe?

Tente colocar "verdadeiro" no início
bool OrderBuy = false, OrderSell = false,