double GetLotSize()
{
double Ls=0;
datetime last = 0, openTime;
for (int pos=OrdersTotal()-1;pos>=0;pos--)
{
if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == _Symbol && OrderMagicNumber() == Magic)
{
if(OrderType() == OP_BUY || OrderType() == OP_SELL) {
if ((openTime = OrderOpenTime()) > last) {
last = openTime;
Ls = OrderLots();
}
}
}
}
}
return Ls;
}
voidOnTick()
{
// Получим значение индикатора
dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.// Если нет открытых ордеров, то входим в условиеif(CountOrders()==0)
{
if(GetLotSize()>LotControl) {openPrice = dMA + deviation * _Point;}
else
openPrice = dMA;
//Если появился сигнал на покупку, то откроем ордер на покупкуif(bSignalBuy() == true)
vOrderOpenBuy();
// Если появился сигнал на продажу, то откроем ордер на продажуif(bSignalSell() == true)
vOrderOpenSell();
}
// Проверяем, вышел ли текущий баланс по открытому ордеру за вилку из внешних переменных CountLoss и CountProfit// if(GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*-1)// {// Если да, то закроем ордер по текущей цене, не дожидаясь стопа или тейка// CloseOrder();// }
DrawLABEL("lab_Take",1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2),AC));
}
//+-----------------------------------------------------------------------------------------------+//| Функция проверки открытых оредров |//+-----------------------------------------------------------------------------------------------+int CountOrders()
{
int cnt=0;
int i=OrdersTotal()-1;
for(int pos=i;pos>=0;pos--)
{
if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()==_Symbol)
{
if(OrderMagicNumber()==Magic) cnt++;
}
}
}
return(cnt);
}
//+-----------------------------------------------------------------------------------------------+//| Функция поиска сигнала на покупку |//+-----------------------------------------------------------------------------------------------+bool bSignalBuy()
{
if (openPrice > Open[1] && openPrice < Close[1]) //Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика.return(true);
return(false);
}
//+-----------------------------------------------------------------------------------------------+//| Функция поиска сигнала на продажу |//+-----------------------------------------------------------------------------------------------+bool bSignalSell()
{
if(openPrice< Open[1] && openPrice > Close[1])
return(true);
return(false);
}
if (bSignalBuy()) {
if (GetLotSize() > LotControl)
vOrderOpenSell();
else
vOrderOpenBuy();
}
但仍然在同一时间打开两个不同方向的仓位?这不可能是正确的!
double GetLotSize()
{
double Ls=0;
datetime last = 0, openTime;
for (int pos=OrdersTotal()-1;pos>=0;pos--)
{
if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == _Symbol && OrderMagicNumber() == Magic)
{
if(OrderType() == OP_BUY || OrderType() == OP_SELL) {
if ((openTime = OrderOpenTime()) > last) {
last = openTime;
Ls = OrderLots();
}
}
}
}
}
return Ls;
}
关于这个代码,很可能是没有任何变化。由于订单是按关闭顺序执行的。
尽可能地整理好你的算法。
voidOnTick()
{
// Получим значение индикатора
dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.// Если нет открытых ордеров, то входим в условиеif(CountOrders()==0)
{
if(GetLotSize()>LotControl) {openPrice = dMA + deviation * _Point;}
else
openPrice = dMA;
//Если появился сигнал на покупку, то откроем ордер на покупкуif(bSignalBuy() == true)
vOrderOpenBuy();
// Если появился сигнал на продажу, то откроем ордер на продажуif(bSignalSell() == true)
vOrderOpenSell();
}
// Проверяем, вышел ли текущий баланс по открытому ордеру за вилку из внешних переменных CountLoss и CountProfit// if(GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*-1)// {// Если да, то закроем ордер по текущей цене, не дожидаясь стопа или тейка// CloseOrder();// }
DrawLABEL("lab_Take",1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2),AC));
}
你好!
请检查我哪里出错了(它不想工作)。
我希望买入信号被偏差* _Point(在设置中设置) 移位,如果(GetLotSize()>LotControl)。
批量控制 - 也在设置中设置
GetLotSize() - 如同建议。
谢谢你,不知道为什么没有任何效果。
谢谢你。由于某种原因,它没有任何效果。
我写道。
但仍然在同一时间打开两个不同方向的仓位?这不可能是正确的!
关于这个代码,很可能是没有任何变化。由于订单是按关闭顺序执行的。
尽可能地整理好你的算法。
你应该检查一下你的算法。 在这里,你是通过买入和卖出信号进入的,没有进一步的内容。什么可能在这里不起作用?没有进入或退出功能...
关于交易、自动交易系统和策略测试的论坛
新手对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论
MakarFX, 2021.12.02 18:30
这里面有什么?你在本质上没有任何改变。你刚刚对OrderCloseTime进行了更多的调用。代码被拉长到一行。而且,它的可读性变得更差。但结果仍然是一样的。
那这里呢?你在本质上并没有改变什么。你刚刚对OrderCloseTime进行了更多的调用。但结果是一样的。
睁开你的眼睛
请在演播室中进行争论
请在演播室中进行争论。
现在睁开你的眼睛
那这里呢?你在本质上并没有改变什么。你刚刚对OrderCloseTime进行了更多的调用。而我们已经将代码拉长到一行。而且,它的可读性变得更差。但结果是一样的。
就我所见,区别在于以下几点。
现在睁开你的眼睛。
(叹气)好吧。我错过了那一刻。我承认这一点。
就我所见,区别如下。