[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要路过。没有你就无处可去 - 3. - 页 509

 

edyuson:
Как зделать, чтоб не сразу умножал, а скажем через два-три раза? Пример: лот=0,01, еще - 0,01, еще - 0,01 и только после умножать. Подскажите, если не много возни. Спасибо.

sergeev:

做一个int计数器,在每次开场时加+1。

一旦设置了正确的计数器值,也允许做lot*koef。


是的,这并不像我想象的那么容易,现在开始出现了。而循环:lot-0.01,lot-0.01,lot-0.01,只有在乘以lot-0.02,lot-0.02,lot-0.02后,才能进一步:lot-0.04,lot-0.04,lot-0.04 ....应该被利润打断,继续用手。其他论坛上的人有一些关于这个问题的变体。你可以声明 double koef[]={ 1.0, 2.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1 。0, 1.0, 2.0 .......}- 作为一个数组,用所需的系数填充它,以及一个静态或全局变量 int k=0;
然后lot=lot*koef[k++]; 开始系列:k=0。

和这样的:
int k = 1;
int koef = 3;
if (k/koef == k) { lot*=2; k++; } 但一切都不一样。

我试过一个计数器,如:int j;
for(j=0; j<15; j++)
,但还是不一样。
这里都是:
int X=0;
double S = 0.0000;
extern double lot=0.01;
extern double koef=2.0;
extern int SL=30;
extern int TP=120;
double dl;
double a;
int init()
{
a=lot;
return(0); }
int deinit()
{
return(0);
}

int start()

{
if(OrdersTotal() ==0 && X==1)
{
if (Close[0]>dl){lot=a;}.
X=0;
}

如果(OrdersTotal() == 0 && X==2)
{
if (Close[0]<dl){lot=a;}。
X=0;
}


如果(OrdersTotal() == 0 && Close[1]>Open[1])
{
dl=Close[0];
OrderSend(Symbol(,OP_BUY,lot,Ask,3,Ask-SL*0.0001,Ask+TP*0.0001,",14774,0,Blue);
//--------------------------------------------------------------------

lot=lot*koef;
X=1;
}

if(OrdersTotal() == 0 && Close[1] <Open[1])
{
dl=Close[0];
OrderSend(Symbol(,OP_SELL,lot,Bid,3,Bid+SL*0.0001,Bid-TP*0.0001,",14774,0,Red);
//研究一些haler 可能有帮助
lot=lot*koef;

X=2;
}
}
return(0);
//这只是一个马特。

 

谢谢,但你看,有两个价格,一个是订单的开盘价,另一个是止损价,到止损的点数和点数的价格是已知的。我如何计算手数,以便在价格达到止损时损失为存款的10%?我只是不善于处理数字。

我也不明白

对于交叉汇率,点值以美元表示,计算公式为:
PIP = LOT_SIZE * TICK_SIZE * BASE_QUOTE / CURRENT_QUOTE,
其中LOT_SIZE为手数,TICK_SIZE为点数,BASE_QUOTE为基础(第一)货币对美元的当前报价,CURRENT_QUOTE为该货币对的当前汇率。

你如何理解这第一种货币对美元?

 

是的...紧密...:-)

基准(第一)货币对美元,在英镑 对日元的例子中,就是英镑/日元,将是英镑/美元

我重新做了这个 脚本,这就是你所需要的,根据资金量和止损大小计算交易头寸的数量。

你也需要它--"我面临一个问题,我已经挣扎了三天,无法解决它。在完成的专家顾问中,我决定输入风险百分比,而不是手数,所以我需要计算手数来停止,例如,在10 000点的时候,1%的风险在100点的时候停止,这将是大约0.1手,在200手的时候停止,手数应该是0.05,所以1%的风险保持在同一水平。我希望一切都很清楚。 而你在这里写。

"我如何计算手数,以便使损失等于存款的10%,例如,如果价格达到止损点?我只是不善于处理数字。"

所以我修改了教程中的手数计算 功能--其描述和方法是一样的,只是不按存款规模的百分比计算手数,而是完全按你(在这个例子中由我给出--见脚本,上面的链接)的条件计算交易手数。

extern string A0 = "Параметры ММ и мониторинга";
extern double Lots = 0;           // Стартовый лот = 0 для использования максимального риска на капитал в процентах, в зависимости от величины стоп-лосса
extern int StopLoss = 1000;
extern int TakeProfit =4000;      // TakeProfit для новых ордеров (пунктов)
extern  double MaxRisk = 10;      // риск на капитал в %
                                  // рассчитываем объем позиции взависимости от размера стопа, при заданном риске
                                  // например при депо 10 000 риск 1% при стопе 100 пп это будет примерно лот 0.1,
                                  // при стопе 200 пп уже лот должен быть 0.05, для того чтобы риск 1% остался на том же уровне

int start()
{    
   //----------------------------------СТАРТ------------------------------------------------------------------------------------- 
 
// ...  

//----------------------------------Расчет объема лота------------------------------------------------------------------------ 
  if (Lot(StopLoss)==false)  
                        {
                          Comment(" Пополните счет. Не хватает средств на минимальный лот. Советник остановлен.");// Если средств не хватает на мин, то выход
                          Print  ("Не хватает средств на минимальный лот. Lots_New = ",Lots_New, " AccountFreeMargin() = ", AccountFreeMargin()); 
                                                                                                   // Если средств не хватает на мин, то выход
                          return (0);
                        }  
// ---------НОРМАЛИЗУЕМ НОВЫЕ РАСЧЕТНЫЕ ЛОТЫ И ОТКРЫВАЕМ ОЧЕРЕДНУЮ ПОЗИЦИЮ...                          
   Lots_New = NormalizeLots(Lots_New);      

//... здесь условия на открытие поз и установка ордеров

}//------------------------------------------Конец Старт-----------------------------------------------------

//+------------------------------------------------------------------+
//| Нормализация лота                                                |
//+------------------------------------------------------------------+

double NormalizeLots(double lot)
{
   double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
   double lots = NormalizeDouble(lot / lotStep, 0) * lotStep;   
   lots = MathMax(lots, MarketInfo(Symbol(), MODE_MINLOT));
   lots = MathMin(lots, MarketInfo(Symbol(), MODE_MAXLOT));   
   return (lots);
}

//--------------------------------------------------------------------
// Lot.mqh
// 
//--------------------------------------------------------------- 1 --
// Функция вычисления количества лотов.
// Глобальные переменные:
// double Lots_New - количество лотов для новых ордеров (вычисляется)
// double Lots     - желаемое количество лотов, заданное пользовател.
// double  MaksRisk  - процент риска
// Возвращаемые значения:
// true  - если средств хватает на минимальный лот
// false - если средств не хватает на минимальный лот
//--------------------------------------------------------------- 2 --
bool Lot(int sl)                               // Позовательская ф-ия
  {
   string Symb   =Symbol();                    // Финансовый инструм.
   double One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);//Стоим. 1 лота
   double Min_Lot=MarketInfo(Symb,MODE_MINLOT);// Мин. размер. лотов
   double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
   double Step   =MarketInfo(Symb,MODE_LOTSTEP);//Шаг изменен размера
   double Free   =AccountFreeMargin();         // Свободные средства
   double LotVal =MarketInfo(Symbol(),MODE_TICKVALUE);//стоимость 1 пункта для 1 лота
   

//--------------------------------------------------------------- 3 --
   if (Lots > 0)                                 // Лоты заданы явно..
     {                                         // ..проверим это
      double Money=Lots*One_Lot;               // Стоимость ордера
      if(Money<=AccountFreeMargin())           // Средств хватает..
         Lots_New=Lots;                        // ..принимаем заданное
      else                                     // Если не хватает..
         Lots_New=MathFloor(Free/One_Lot/Step)*Step;// Расчёт лотов
     }
//--------------------------------------------------------------- 4 --
  else                                        // Если лоты не заданы
     {                                         // то берём процент 
                                               // Желаем. колич.лотов:
                                               
      Lots_New =MathFloor((Free*MaxRisk/100)/(sl*LotVal)/Step)*Step;
      if(Lots_New<Min_Lot) Lots_New=Min_Lot;
      if(Lots_New>Max_Lot) Lots_New=Max_Lot;
      Print ("Lot_New в ф-ии Lots = ",Lots_New, "ширина канала = ",sl, "Point  = ",Point);
     }
//--------------------------------------------------------------- 5 --
   if (Lots_New < Min_Lot)                     // Если меньше допуст..
      Lots_New=Min_Lot;                        // .. то миниамальный
   if (Lots_New*One_Lot > AccountFreeMargin()) // Не хватает даже..
     {                                         // ..на минимальн. лот:(
      Print ("Не хватает средств на минимальный лот.  Lots_New = ",Lots_New, " AccountFreeMargin() = ", AccountFreeMargin());  // Сообщение..
      return(false);                           // ..и выход 
     }
   return(true);                               // Выход из польз. ф-ии
  }
//--------------------------------------------------------------- 6 --
 
Reshetov:
static int Kvadrat = 0;



我试过这个方法。现在,在整个测试期间,有一个待定的 STOPLOSS订单 已经打开,就是这样......也许我的终端出现了故障?

该程序应该每天从早上7点到9点找到最高和最低价格,并在这些水平上下达止损单。

附加的文件:
 
mamba5:


我试过这个方法。现在,在整个测试期间,有一个待定的STOPLOSS订单已经打开,就是这样......也许我的终端出现了故障?

你在查看日志时是否有困难,以了解到底是什么地方出现了故障?
 

你好。

有没有人在功能上遇到过问题?

IsDemo()

?

我总是得到一个结果--账户是真实的(无论它是真实的还是模拟的)。

 
nemo811:

你好。

有没有人在功能上遇到过问题?

?

我总是得到一个结果--我的账户是真实的(无论它是真实的还是模拟的)。

我把一个EA放在模拟账户 的图表上,上面有一个代码。

int start()
  {
//----
   if (IsDemo()) {
      Print("Это демо");
      return(0);
   }
   Print("Это не демо");
   
//----
   return(0);
}
在该杂志中写道。"这是个演示。
 
Reshetov:

我有一个模拟账户,图表上有一个带代码的EA。

它在日志中写道。"这是个演示。

我在phibogroup上有一个模拟账户--出于某种神秘的原因,它说我在一个真实账户上。在你的版本中,它显示 - 这不是一个演示。

原来,在某种程度上,DC本身是变态的

 
nemo811:

我在phibogroup上有一个演示--出于某种神秘的原因,它说我是在真实的。在你的图片版本中--这不是一个演示。

事实证明,不知何故,DC本身已经变得变态了

一些经纪商为模拟和真实提供一个服务器。请向经纪人的支持部门查询。
 
Reshetov:
有些经纪公司的一台服务器同时用于模拟和真实。请向你的经纪人支持部门查询。

谢谢你。