ASAR

 

Я закончил платить людям за создание моих советников. Наконец-то пришло время сделать это самому.

Я хотел бы создать шаблон, на основе которого я смогу в дальнейшем строить советники под названием ASAR (ATR Stop And Reverse), но не знаю, как начать, поскольку это будет мой первый советник. Поскольку немодифицированный шаблон будет просто ATR трейлинг стопом (и реверсом) с ATR размером лота, он будет работать без остановки в течение недели от открытия рынка до его закрытия. Таким образом, торговый сигнал на открытие рынка будет просто открываться в направлении предыдущего бара (который будет последним баром предыдущего закрытия рынка). Поскольку это произойдет только один раз в начале недели, потребуется ли для этого скрипт?

Как мне понять, как это закодировать?

Я видел примеры, которые показывают процесс кодирования, но проблема таких примеров в том, что они не показывают, как разобраться с тем, что не представлено. Например, в книге MetaQuotes по MQL4 хорошо объясняются основы, сопровождаемые конкретными примерами, но во всем, что я читал, я не помню, чтобы я встречал информацию, которая позволила бы мне разобраться с кодированием исходного торгового сигнала, который я выбрал для шаблона.

 
ASAR:

Как мне разобраться, как это закодировать?

Похоже, вы поняли, что кодирование - это легкая часть... Вас можно научить, как кодировать, какие бывают типы переменных, каков синтаксис кода... но то, о чем вы спрашиваете, - это решение проблем. Этому гораздо труднее научить...

Лучший совет, который я могу вам дать: напишите, что вы хотите сделать... затем напишите, как бы вы это сделали при ручной торговле... затем расширьте это шаг за шагом, как если бы вы показывали MT4 полному новичку... тогда у вас будет что-то, что вы сможете закодировать.

 
RaptorUK:

Похоже, вы поняли, что кодирование - это легкая часть... Вас можно научить, как кодировать, какие бывают типы переменных, каков синтаксис кода... но то, о чем вы спрашиваете, - это решение проблем. Этому гораздо труднее научить...

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


Хорошо, я сделаю это.

Спасибо за ваши советы. Это определенно будет приключение.

 

Хорошо, я решил проблему открытия в направлении предыдущего бара с помощью функции

(Bar 1 Close > Bar 1 Open; OP_BUY)

(Bar 1 Close < Bar 1 Open; OP_SELL)

Теперь мне интересно, существует ли код для открытия ордера по закрытию предыдущего ордера?

 
ASAR:

Хорошо, я решил проблему открытия в направлении предыдущего бара с помощью функции

(Bar 1 Close > Bar 1 Open; OP_BUY)

(Bar 1 Close < Bar 1 Open; OP_SELL)

Теперь мне интересно, есть ли код для открытия ордера по закрытию предыдущего ордера?


Это не может быть так, как вы пишете в mq4

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

вам нужно только знать, как это сделать...

вам нужно найти в истории ордеров последнюю закрытую сделку вашего советника, а затем посмотреть на его orderopenprice, ordercloseprice и ordertype

 

Спасибо.

Мне просто нужна была какая-то подсказка, чтобы направить меня в правильном направлении, и информация, которую вы предоставили, вероятно, сделает это для меня.

 

Итак, вот код, который я сгенерировал на сайте Expert Advisor Builder для открытия первой сделки.

//+------------------------------------------------------------------+
//| This MQL is generated by Expert Advisor Builder                  |
//|                http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/ |
//|                                                                  |
//|  In no event will author be liable for any damages whatsoever.   |
//|                      Use at your own risk.                       |
//|                                                                  |
//+------------------- DO NOT REMOVE THIS HEADER --------------------+
#define SIGNAL_NONE 0
#define SIGNAL_BUY   1
#define SIGNAL_SELL  2
#define SIGNAL_CLOSEBUY 3
#define SIGNAL_CLOSESELL 4
#property copyright "Expert Advisor Builder"
#property link      "http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/"
extern int MagicNumber = 0;
extern bool SignalMail = False;
extern bool EachTickMode = True;
extern double Lots = 0.01;
extern int Slippage = 3;
extern bool UseStopLoss = False;
extern int StopLoss = 30;
extern bool UseTakeProfit = False;
extern int TakeProfit = 60;
extern bool UseTrailingStop = True;
extern int TrailingStop = 30;
int BarCount;
int Current;
bool TickCheck = False;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init() {
   BarCount = Bars;
   if (EachTickMode) Current = 0; else Current = 1;
   return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit() {
   return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start() {
   int Order = SIGNAL_NONE;
   int Total, Ticket;
   double StopLossLevel, TakeProfitLevel;
 
   if (EachTickMode && Bars != BarCount) TickCheck = False;
   Total = OrdersTotal();
   Order = SIGNAL_NONE;
   //+------------------------------------------------------------------+
   //| Variable Begin                                                   |
   //+------------------------------------------------------------------+
double Buy1_1 = iClose(NULL, 0, Current + 1);
double Buy1_2 = iOpen(NULL, 0, Current + 1);
double Sell1_1 = iClose(NULL, 0, Current + 1);
double Sell1_2 = iOpen(NULL, 0, Current + 1);
 
   
   //+------------------------------------------------------------------+
   //| Variable End                                                     |
   //+------------------------------------------------------------------+
   //Check position
   bool IsTrade = False;
   for (int i = 0; i < Total; i ++) {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderType() <= OP_SELL &&  OrderSymbol() == Symbol()) {
         IsTrade = True;
         if(OrderType() == OP_BUY) {
            //Close
            //+------------------------------------------------------------------+
            //| Signal Begin(Exit Buy)                                           |
            //+------------------------------------------------------------------+
            
            //+------------------------------------------------------------------+
            //| Signal End(Exit Buy)                                             |
            //+------------------------------------------------------------------+
            if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
               OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);
               if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");
               if (!EachTickMode) BarCount = Bars;
               IsTrade = False;
               continue;
            }
            //Trailing stop
            if(UseTrailingStop && TrailingStop > 0) {                 
               if(Bid - OrderOpenPrice() > Point * TrailingStop) {
                  if(OrderStopLoss() < Bid - Point * TrailingStop) {
                     OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);
                     if (!EachTickMode) BarCount = Bars;
                     continue;
                  }
               }
            }
         } else {
            //Close
            //+------------------------------------------------------------------+
            //| Signal Begin(Exit Sell)                                          |
            //+------------------------------------------------------------------+
            
            //+------------------------------------------------------------------+
            //| Signal End(Exit Sell)                                            |
            //+------------------------------------------------------------------+
            if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
               OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);
               if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");
               if (!EachTickMode) BarCount = Bars;
               IsTrade = False;
               continue;
            }
            //Trailing stop
            if(UseTrailingStop && TrailingStop > 0) {                 
               if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {
                  if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {
                     OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);
                     if (!EachTickMode) BarCount = Bars;
                     continue;
                  }
               }
            }
         }
      }
   }
   //+------------------------------------------------------------------+
   //| Signal Begin(Entry)                                              |
   //+------------------------------------------------------------------+
   if (Buy1_1 > Buy1_2) Order = SIGNAL_BUY;
   if (Sell1_1 < Sell1_2) Order = SIGNAL_SELL;
   //+------------------------------------------------------------------+
   //| Signal End                                                       |
   //+------------------------------------------------------------------+
   //Buy
   if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
      if(!IsTrade) {
         //Check free margin
         if (AccountFreeMargin() < (1000 * Lots)) {
            Print("We have no money. Free Margin = ", AccountFreeMargin());
            return(0);
         }
         if (UseStopLoss) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0;
         if (UseTakeProfit) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0;
         Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);
         if(Ticket > 0) {
            if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
    Print("BUY order opened : ", OrderOpenPrice());
                if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");
   } else {
    Print("Error opening BUY order : ", GetLastError());
   }
         }
         if (EachTickMode) TickCheck = True;
         if (!EachTickMode) BarCount = Bars;
         return(0);
      }
   }
   //Sell
   if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
      if(!IsTrade) {
         //Check free margin
         if (AccountFreeMargin() < (1000 * Lots)) {
            Print("We have no money. Free Margin = ", AccountFreeMargin());
            return(0);
         }
         if (UseStopLoss) StopLossLevel = Bid + StopLoss * Point; else StopLossLevel = 0.0;
         if (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; else TakeProfitLevel = 0.0;
         Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);
         if(Ticket > 0) {
            if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
    Print("SELL order opened : ", OrderOpenPrice());
                if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell");
   } else {
    Print("Error opening SELL order : ", GetLastError());
   }
         }
         if (EachTickMode) TickCheck = True;
         if (!EachTickMode) BarCount = Bars;
         return(0);
      }
   }
   if (!EachTickMode) BarCount = Bars;
   return(0);
}
//+------------------------------------------------------------------+


And this is a loop that's been suggested to me that I'd like to add but am unsure of where to apply it.
 

for(int i=0;i < OrdersHistoryTotal() ;i++)
  {
   OrderSelect(i, 
SELECT_BY_POS)
   
   if (OrderMagicNumber() == InstanceID)
  
lastClosedDirection = OrderType() ;
  }

Can anyone tell me where this should be applied? 
 
ASAR:

Итак, вот код, который я сгенерировал на сайте Expert Advisor Builder для открытия первой сделки.

О боже... прочитайте это сообщение и остальную часть темы:https://www.mql5.com/en/forum/139608.
 
ASAR:

И это цикл, который мне предложили, который я хотел бы добавить, но не знаю, где его применить.

Что делает этот код? Что такое InstanceID? Что вы собираетесь делать с lastClosedDirection?
 
Если вы хотите использовать код Expert Advisor Builder, я предлагаю вам обратиться за помощью на их форум: http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/forum/viewforum.php?f=4
 
ASAR:

Итак, вот код, который я сгенерировал на сайте Expert Advisor Builder для открытия первой сделки.

Когда я учился в колледже, на первой лекции по информатике преподаватель поздоровался со мной. Затем он говорил: "Купите книгу и приступайте к работе", "Если у вас возникнут проблемы, будут лабораторные занятия, и вы сможете спросить аспирантов" - которые должны помогать во время этих лабораторных занятий. Вы не склонны обучать вычислительной технике; вы позволяете человеку учиться. Одна из первых программ в книге, определяющей язык программирования C, заключается в том, чтобы написать на экране "HELLO WORLD". Есть причина, по которой вам не дают программу в 1000 строк и не говорят, что нужно внести в нее изменения!

Этот так называемый Expert Adviser Builder - обуза для любого, кто серьезно относится к созданию советников и торговле ими на деньги. Вы должны иметь возможность посмотреть на любую строку кода в вашем советнике и понять, что он делает и почему. Я бы не стал использовать чужой код. Посмотрите, что они делают, и сделайте что-то похожее, конечно, но каждую строчку пишите сами - если вы серьезно к этому относитесь.

А код конструктора советника - это не очень хороший код ИМХО.

Причина обращения: