Ошибка заказа советника

 

Ребята, я пытаюсь сделать этого робота, но он открывает много заказов и не соблюдает условия.


Правила торговли:


Свеча 1: должна быть высокой (зеленая).

Свеча 0: совершает продажу, когда цена достигает «Цена открытия - 200 пунктов».

Свеча 0: Take : цена входа - 100 пунктов

Свеча 0: стоп : цена входа - 400 пунктов

---

Если цена вызывает указанное выше условие, но возвращает +150 пунктов. Я закрываю первоначальную сделку и сразу открываю другую с тейк-профитом 120 пипсов и стопом 250 пипсов.

---

Не могли бы вы мне помочь с причиной ошибки?

//+------------------------------------------------------------------+
//|                                                 AlaskaSquare.mq5 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Trade\Trade.mqh>
CTrade trade;

MqlRates rates[];

bool Alaska = false;
bool Square = false;

input double contratos_alaska = 25;
input double contratos_square = 100;

input double take_alaska = 100;
input double take_square = 120;
input double stop_alaska = 400;
input double stop_square = 250;

double pts_aciona_alaska = 200;
ulong  MagicNumber = 123000123;
double preco_alaska;

//+------------------------------------------------------------------+
int OnInit() {

   trade.SetExpertMagicNumber(MagicNumber);
   ArraySetAsSeries(rates, true);
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {

}

//+------------------------------------------------------------------+
void OnTick() {
   CopyRates(Symbol(), Period(), 0, 3, rates);

   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_ASK), _Digits);
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits);
   double Last = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_LAST), _Digits);
   preco_alaska = NormalizeDouble(rates[0].open - pts_aciona_alaska * _Point,_Digits);

   
   bool candle_traded = false;
   bool filter = rates[1].close > rates[1].open;
   bool signal = Last <= preco_alaska;

   if(IsNewBar())
      candle_traded = false;

   if(PositionsTotal() == 0 && OrdersTotal() == 0 && !candle_traded) {
      if(filter && signal) {
         
         double take = NormalizeDouble(Bid - take_alaska * _Point,_Digits);
         double stop = NormalizeDouble(Ask + stop_alaska * _Point,_Digits);

         trade.Sell(contratos_alaska, Symbol(), Bid, stop, take, "Venda Alaska");
         Print("Venda Alaska");
         Alaska = true;
         candle_traded = true;
      }
   }

   if(PositionsTotal() == 1 && Alaska && !Square ) {
      Square = AcionaSquare(Last);
   }

   if(PositionsTotal() == 0 && OrdersTotal() == 0 && Square) {
      
      double take = NormalizeDouble(Bid - take_square * _Point,_Digits);
      double stop = NormalizeDouble(Ask + stop_square * _Point,_Digits);
      
      trade.Sell(contratos_square, Symbol(), Bid, stop, take, "Venda Square");
      Print("Venda Square");
   }

}

//+------------------------------------------------------------------+
bool AcionaSquare(double preco) {

   for(int i = PositionsTotal() - 1 ; i >= 0; i--) {
      string simbolo_ = PositionGetSymbol(i);
      ulong magic = PositionGetInteger(POSITION_MAGIC);

      if(simbolo_ == Symbol() && magic == MagicNumber) {
         ulong ticket = PositionGetTicket(i);
         double preco_entrada = PositionGetDouble(POSITION_PRICE_OPEN);
         double preco_square = NormalizeDouble(preco_entrada + 150 * _Point,_Digits);

         if(preco >= preco_square) {
            Print("Posição Alaska Fechada, acionando Square");
            return trade.PositionClose(ticket);
         }
      }
   }

   return false;
}
//+------------------------------------------------------------------+
bool IsNewBar(datetime barTime = 0) {
   barTime = (barTime != 0) ? barTime : iTime(_Symbol, _Period, 0);
   static datetime barTimeLast = 0;
   bool            result      = barTime != barTimeLast;
   barTimeLast = barTime;
   return result;
}
//+------------------------------------------------------------------+
 
diegotfcastro:
Ребята, я пытаюсь сделать этого робота, но он открывает много заказов и не соблюдает условия.
Правила торговли:
Свеча 1: должна быть высокой (зеленая).
Свеча 0: совершает продажу, когда цена достигает «Цена открытия - 200 пунктов».
Свеча 0: Take : цена входа - 100 пунктов
Свеча 0: стоп : цена входа - 400 пунктов
---
Если цена вызывает указанное выше условие, но возвращает +150 пунктов. Я закрываю первоначальную сделку и сразу открываю другую с тейк-профитом 120 пипсов и стопом 250 пипсов.
---
Не могли бы вы мне помочь с причиной ошибки?

Так в чем ошибка? Как ведет себя робот и как должен себя вести?