OrderSend()函数中的一个错误? - 页 9

 
borilunad:
因此,没有必要设定棉签与棉条的准确比例。你只能考虑用棉签,最好把它们作为过滤器而不是信号。

鲍里斯,你的观点部分正确。基本上,边框是一个指针。不过,这里同样有几个选择。有些人希望进入反趋势,有些人希望跟随趋势。有很多变化,但它们还没有真正发挥作用 :(
 
hoz:

鲍里斯,你说的部分正确。基本上,马车是一个指针。不过,这里同样有很多选择。有些人希望进入反趋势,有些人则进入趋势。有很多变化,但还没有达到预期效果 :(
不要为别人而悲伤!寻找你自己的,你就会找到它!如果你不知道该怎么做,你就不能做,因为价格跟不上。你必须进入市场,其趋势,至少有较少的风险。而最主要的是跟踪该位置到可能的利润和最佳关闭。:)
 

重点不是悲伤,也不是对他人。 底线是,有一个错误,而支持是完全没有反应的!难道他们真的不关心客户吗。 我对它非常好奇。该请求已被搁置了近一个星期,而且没有任何反应......我不知道该怎么做......也许你可以拍一段视频,显示当前条形图上的价格,皮重物直接切过它,但没有挂单?是的,我对这一时刻有依恋,但只是为了了解原因。我将在周一把它放在Demo上测试,但是......但话说回来......如果测试器完全是小毛病,那又有什么用呢?

 
hoz:

...也许有一个视频,并显示价格是如何走的,在当前的酒吧,焦油切过的机器...

我在马赫卡的时候就没有这种情况。
 
tara:
我和马什卡没有这种关系。


哪个马什卡?

我特别写了在哪些情况下。为什么你想把它变成关于你的事?这个主题已经有9页了,但它仍然在那里。

我把代码附在后面。下面是同样的代码,供查看。

//+-----------------------------------------------------------------------------------+
//|                                                                       test_Ma.mq4 |
//|                                                                               hoz |
//|                                                                                   |
//+-----------------------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""

extern string ___H0 = " ___________ Параметры МА ____________ ";
extern int i_TF = 0,
           i_fastMaPeriod = 10,
           i_slowMaPeriod = 21;
extern string ___H1 = " _____ Параметры ордера _______";
extern int i_magic = 3333021;
extern double i_thresholdFromMa = 5;                           // Отступ от МА
extern double buyHear = 10,                                    // Расстояние от МА до отложки на бай
              SellHear = 10;                                   // Расстояние от МА до отложки на шорт
// Машечки
double fastMa,
       slowMa;
double pt;
datetime lastBarTime;                                          // Время проведения последних рассчётов
// Переменные рыночного окружения
double g_spread,
       g_stopLevel,
       g_tickSize;
// Идентификаторы положений машек
#define MA_DIRECT_TO_UP      0                                 // Машки направлены вверх
#define MA_DIRECT_TO_DOWN    1                                 // Машки направлены вниз
#define MA_DIRECT_TO_NONE   -1                                 // Машки во флете
#define SIGNAL_BUY           0                                 // Сигнал на покупку
#define SIGNAL_SELL          1                                 // Сигнал на продажу
#define SIGNAL_NO           -1                                 // Сигнала нет

//+-------------------------------------------------------------------------------------+
//| Функция иницилизации                                                                |
//+-------------------------------------------------------------------------------------+
int init()
{
   GetMarketInfo();
   
   lastBarTime = 0;
   
   if (Digits  == 2 || Digits == 4)
       pt = Point;
   if (Digits == 1 || Digits == 3 || Digits == 5)
       pt = Point * 10;
   if (Digits == 6)
       pt = Point * 100;
   if (Digits == 7)
       pt = Point * 1000;
   

  return (0);
}
//+-------------------------------------------------------------------------------------+
//| Функция деиницилизации                                                              |
//+-------------------------------------------------------------------------------------+
int deinit()
{
//----
   
//----
  return (0);
}
//+-------------------------------------------------------------------------------------+
//| Сбор рыночных данных                                                                |
//+-------------------------------------------------------------------------------------+
void GetMarketInfo()
{
  g_spread = MarketInfo(Symbol(),MODE_SPREAD) * pt;
  g_stopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL) * pt;
  g_tickSize = MarketInfo(Symbol(),MODE_TICKSIZE) * pt;
}
//+-------------------------------------------------------------------------------------+
//| Функция нормализации                                                                |
//+-------------------------------------------------------------------------------------+
double ND(double A)
{
  return (NormalizeDouble(A, Digits));
}
//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy()
{
   int ticket = -1;
   double OOP = fastMa + buyHear * pt;             // Получаем значение цны открытия
   
   if ((ND(OOP) - Ask) >= MathMax(g_stopLevel,g_spread))             // Проверка цену открытия на стоплевел          
   {
       if (ND(OOP) > Ask)           // Проверка что цена открытия выше Ask, т.к. у нас вход отложенником
       {
           Print("Bid = ", Bid);
           Print("Ask = ", Ask);
           Print("fastMa = ", fastMa);
           Print("Цена покупки = ", fastMa + buyHear * pt);
           Print("i_thresholdFromMa * pt = ", i_thresholdFromMa * pt);
           ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(OOP), 3, 0, 0, NULL, i_magic, 0);
       }
   }
   if (ticket > 0)
   {
       return (true);
   }
   else
    
   Alert (GetLastError());
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell()
{
   int ticket = -1;
   double OOP = fastMa - SellHear * pt;               // Получаем значение цны открытия
   
   if ((Bid - ND(OOP)) >= MathMax(g_stopLevel,g_spread))                // Проверка цену открытия на стоплевел
   {
       if (ND(OOP) < Bid)           // Проверка что цена открытия ниже Bid, т.к. у нас вход отложенником
       {
           Print("Bid = ", Bid);
           Print("Ask = ", Ask);
           Print("fastMa = ", fastMa);
           Print("fastMa + i_thresholdFromMa * pt = ", fastMa + i_thresholdFromMa * pt);
           Print("Цена покупки = ", fastMa + buyHear * pt);
           Print("i_thresholdFromMa * pt = ", i_thresholdFromMa * pt);
           ticket = OrderSend(Symbol(), OP_SELLSTOP, 0.1, ND(OOP), 3, 0, 0, NULL, i_magic, 0);
       }
   }
   if (ticket > 0)
   {
       return (true);
   }
   else
    
   Alert (GetLastError());
}
//+-------------------------------------------------------------------------------------+
//| Получаем относительное положение машек                                              |
//+-------------------------------------------------------------------------------------+
int GetStateMa(double fastMa, double slowMa)
{
   if (fastMa > slowMa)                          // Если условия выполнены, то..
       return (MA_DIRECT_TO_UP);                 // ..машки направлены вниз
   
   if (fastMa < slowMa)                          // Если условия выполнены, то..
       return (MA_DIRECT_TO_DOWN);               // машки направлены вверх
   
   return (MA_DIRECT_TO_NONE);                   // Машки не имеют выраженного направления
}
//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade(int signal)
{
   if (signal == SIGNAL_BUY)                     // Если сигнал на покупку..
       if (!OpenBuy())             // ..покупаем
          return(false);
   
   if (signal == SIGNAL_SELL)                   // Если сигнал на продажу..
       if (!OpenSell())           // ..продаём
          return(false);
       
   return (true);
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий сигнал на открытие позиции                                           |
//+-------------------------------------------------------------------------------------+
int GetSignal()
{
 //  if (FindOrders() > 0)                                 // Если есть открытые ордера, то..
   //    return (SIGNAL_NO);                               //..ничего не делаем
   
   if (GetStateMa(fastMa, slowMa) == MA_DIRECT_TO_UP)
       if ( ND(MathAbs(fastMa - Ask)) <= i_thresholdFromMa * pt) // ..зазор между ценой покупки и машки, <= i_thresholdFromMa..
          return(SIGNAL_BUY);
   if (GetStateMa(fastMa, slowMa) == MA_DIRECT_TO_DOWN)
       if ( ND(MathAbs(fastMa - Bid)) <= i_thresholdFromMa * pt ) // ..зазор между ценой продажи и машки, <= i_thresholdFromMa..
       return(SIGNAL_SELL);
   
   return (SIGNAL_NO);
}
//+-------------------------------------------------------------------------------------+
//| Функция start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
   fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_OPEN,0);
   slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_OPEN,0);
   
 /*  Print("Bid = ", Bid);
   Print("Ask = ", Ask);
   Print("fastMa = ", fastMa);
   Print("i_thresholdFromMa * pt = ", i_thresholdFromMa * pt);
   */
// Отслеживание открытия нового бара
   if (lastBarTime == iTime(NULL, 0, 0))         // На текущем баре все необходимые действия..
       return (0);                      // ..уже были выполнены

// Рассчёт сигнала   
   int signal = GetSignal();
   
// Проведение торговых операций
   if (signal != SIGNAL_NO)
       if (!Trade(signal))
           return (0);
   
   lastBarTime = iTime(NULL, 0, 0);              // На текущем баре все необходимые действия..
                                       // .. успешно выполнены
  return (0);
}

一些酒吧无缘无故地被公然忽视。 当然,他们身上也没有未决的订单。代码是正确的。在我看来,没有什么可修复的。

以下是显示尚未开仓的头寸的截图。测试日期在那里也可以看到。请帮助我找到原因。我已经讨论了这个主题中的所有内容,但没有讨论最初的问题。

1

2

3

附加的文件:
test_ma_4.mq4  10 kb
 
pako:
如果你不介意再次制定ToR,为什么要控制一个新酒吧?



我把它归纳为一句话!还有一件事我没有想到,但我会给你整个要点。

订单的数量 根本不应该有任何限制。也就是说,订单可以以任何数量开立.........我们有多少个并不重要,但我们只需要在当前栏中打开1个订单。就是这样。

也就是说,一个新的交易栏打开了,所以我们可以在这个交易栏中打开1个订单,但在当前交易栏中不能超过1个订单。下一个订单只能在下一个柱子上打开,而不是更早。

现在清楚了吗?

而在这里,你错了...

//+-------------------------------------------------------------------------------------+
//| Функция start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
   fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_OPEN,0); <---------------- fastMa == slowMa 
   slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_OPEN,0);  <--------------  fastMa == slowMa

   

波动周期是不同的......i_fastMaPeriod和i_slowMaPeriod分别是10和21!

 

推荐阅读

https://www.mql5.com/ru/articles/1411

 
hoz:


我是这样做的,而且很容易!我还没有想到1件事,但我将给你整个想法。

对订单的数量根本不应该有任何限制。也就是说,订单可以以任何数量开立...有多少个并不重要,但在当前栏中应该只开1个订单。就是这样。

也就是说,一个新的交易栏打开了,所以我们可以在这个交易栏中打开1个订单,但在当前交易栏中不能超过1个订单。下一个订单只能在下一个柱子上打开,而不是更早。

现在清楚了吗?


保持每条杠上只有一个仓位被打开。

//+------------------------------------------------------------------+
//|                                                     черновик.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   if(NewBar()==true)
       {
        int ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Bid-250*Point,Ask+250*Point," ",16384,0,Green); 
       }
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
bool NewBar() 
    {

       static datetime LastTime = 0;

       if (iTime(NULL,0,0) != LastTime) 
       {
          LastTime = iTime(NULL,0,0);      
          return (true);
       } else
          return (false);
    }
 
pako:


在每根柱子上只保持一个位置开放

你不能这样做。如果你在第一次打勾时没有得到一个条件,那么整整一个小时就会被浪费掉。
 
hoz:


我将使它变得清晰和简单!我还没有想到另外1件事,但我将给你整个想法。

对订单的数量根本不应该有任何限制。也就是说,订单可以以任何数量开立...有多少个并不重要,但在当前栏中应该只开1个订单。就是这样。

也就是说,一个新的交易栏打开了,所以我们可以在这个交易栏中打开1个订单,但在当前交易栏中不能超过1个订单。下一个订单只能在下一个条形图上打开,而不是之前。


因此,在这种情况下
lastBarTime = iTime(NULL, 0, 0);              // На текущем баре все необходимые действия..
我们只有在当前栏位被打开的情况下才能打开订单,即我们应该在函数OpenBuy/Sell中移动这一行