//--- если нету рыночных Buy if(getData.buy==0) { //--- если нет отложенного BuyLimit if(getData.order.buy_limit.number==0) { double slB=(pointsl==0?0:NormalizeDouble(minPrice-pointsl*Point(),Digits())); double tpB=(pointtp==0?0:NormalizeDouble(minPrice+pointtp*Point(),Digits())); ResetLastError(); int ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minPrice, 3, slB, tpB, "", Magic, 0, clrRed); if(ticketUP==-1) Print("ERROR SETTING OP_BUYLIMIT :",GetLastError()); elsePrint("OP_BUYLIMIT OK"); } //--- если есть BuyLimit else { //--- если цена Min больше цены установки BuyLimit if(minPrice>getData.order.buy_limit.price_set) { // модифицировать BuyLimit - поставить его на цену minPrice ... //--- ... и сместить его стоп-уровни относительно новой цены установки } } }
//--- если нету рыночных Sell if(getData.sell==0) { //--- если нет отложенного SellLimit if(getData.order.sell_limit.number==0) { double slS=(pointsl==0?0:NormalizeDouble(maxPrice+pointsl*Point(),Digits())); double tpS=(pointtp==0?0:NormalizeDouble(maxPrice-pointtp*Point(),Digits())); ResetLastError(); int ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxPrice, 3, slS, tpS, "", Magic, 0, clrBlue); if(ticketD==-1) Print("ERROR SETTING OP_SELLLIMIT :",GetLastError()); elsePrint("OP_SELLLIMIT OK"); } //--- если есть SellLimit else { //--- если цена Max меньше цены установки SellLimit if(maxPrice<getData.order.sell_limit.price_set) { // модифицировать SellLimit - поставить его на цену maxPrice ... //--- ... и сместить его стоп-уровни относительно новой цены установки } } }
你去那里,这是不一样的,现在很清楚这1%与什么有关了;)
专家顾问考虑最后X条的最小和最大值,并根据它们下订单。然后,当最大或最小值减少时,你应该删除相应的订单并通过新的数据打开。
不明白到底什么时候修改停顿,但做到了如果最低价格 高于现有的BuyLimit设置价格,那么就需要修改为新的Min价格。
对于SellLimit - 镜像。
我只写了代码,但根本没有检查它--我把它留给你来修改和检查算法和代码的正确性。
input double LotB=0.1; // Лот Buy
input double LotS=0.1; // Лот Sell
input int Pointsl=100; // StopLoss в пунктах
input int Pointtp=100; // TakeProfit в пунктах
input int NumBars=10; // Количество баров для поиска Max/Min
input int Magic=100500; // Magic
//--- global variables
struct DataPendingOrder
{
int number; // Количество
double price_set; // Цена установки
};
struct DataPending
{
DataPendingOrder buy_limit; // BuyLimit
DataPendingOrder buy_stop; // BuyStop
DataPendingOrder sell_limit; // SellLimit
DataPendingOrder sell_stop; // SellStop
};
struct DataOrders
{
int buy; // Количество позиций Buy
int sell; // Количество позиций Sell
DataPending order; // Данные отложенного ордера
};
DataOrders getData; // Данные ордеров и позиций
double lotB, lotS;
int pointsl, pointtp, numBars;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
numBars=(NumBars<1?1:NumBars>Bars?Bars:NumBars);
pointsl=(Pointsl<0?0:Pointsl);
pointtp=(Pointtp<0?0:Pointtp);
double minLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
double maxLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
lotB=(LotB<minLot?minLot:LotB>maxLot?maxLot:LotB);
lotS=(LotS<minLot?minLot:LotS>maxLot?maxLot:LotS);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- заполним структуру количеством ордеров и позиций
GetNumOrders(Symbol(),Magic,getData);
//--- найдём максимальную и минимальную цены за bars свечей
double maxPrice=0.0, minPrice=DBL_MAX;
for(int i=0; i<numBars; i++) {
double max_i=iHigh(Symbol(),PERIOD_CURRENT,i);
if(max_i>maxPrice) maxPrice=max_i;
double min_i=iLow(Symbol(),PERIOD_CURRENT,i);
if(min_i<minPrice) minPrice=min_i;
}
//--- если нету рыночных Buy
if(getData.buy==0) {
//--- если нет отложенного BuyLimit
if(getData.order.buy_limit.number==0) {
double slB=(pointsl==0?0:NormalizeDouble(minPrice-pointsl*Point(),Digits()));
double tpB=(pointtp==0?0:NormalizeDouble(minPrice+pointtp*Point(),Digits()));
ResetLastError();
int ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minPrice, 3, slB, tpB, "", Magic, 0, clrRed);
if(ticketUP==-1) Print("ERROR SETTING OP_BUYLIMIT :",GetLastError());
else Print("OP_BUYLIMIT OK");
}
//--- если есть BuyLimit
else {
//--- если цена Min больше цены установки BuyLimit
if(minPrice>getData.order.buy_limit.price_set) {
// модифицировать BuyLimit - поставить его на цену minPrice ...
//--- ... и сместить его стоп-уровни относительно новой цены установки
}
}
}
//--- если нету рыночных Sell
if(getData.sell==0) {
//--- если нет отложенного SellLimit
if(getData.order.sell_limit.number==0) {
double slS=(pointsl==0?0:NormalizeDouble(maxPrice+pointsl*Point(),Digits()));
double tpS=(pointtp==0?0:NormalizeDouble(maxPrice-pointtp*Point(),Digits()));
ResetLastError();
int ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxPrice, 3, slS, tpS, "", Magic, 0, clrBlue);
if(ticketD==-1) Print("ERROR SETTING OP_SELLLIMIT :",GetLastError());
else Print("OP_SELLLIMIT OK");
}
//--- если есть SellLimit
else {
//--- если цена Max меньше цены установки SellLimit
if(maxPrice<getData.order.sell_limit.price_set) {
// модифицировать SellLimit - поставить его на цену maxPrice ...
//--- ... и сместить его стоп-уровни относительно новой цены установки
}
}
}
//---
string a=(numBars==1)?"bar: ":IntegerToString(numBars,1)+" bar's: ";
Comment("Last ", a, "max ", DoubleToStr(maxPrice, Digits()), ", min ", DoubleToStr(minPrice, Digits()),".");
}
//+------------------------------------------------------------------+
//| Записывает в структуру количество позиций и отложенных ордеров |
//+------------------------------------------------------------------+
void GetNumOrders(string symbol_name, int magic_number, DataOrders &data_of) {
ZeroMemory(data_of);
for(int i=OrdersTotal()-1; i>=0; i--) {
if(OrderSelect(i,SELECT_BY_POS)) {
if(OrderMagicNumber()!=magic_number) continue;
if(OrderSymbol()!=symbol_name) continue;
//--- рыночные позиции
if(OrderType()==OP_BUY) data_of.buy++;
if(OrderType()==OP_SELL) data_of.sell++;
//--- отложенные ордера
if(OrderType()==OP_BUYLIMIT) { data_of.order.buy_limit.number++; data_of.order.buy_limit.price_set=OrderOpenPrice(); }
if(OrderType()==OP_BUYSTOP) { data_of.order.buy_stop.number++; data_of.order.buy_stop.price_set=OrderOpenPrice(); }
if(OrderType()==OP_SELLLIMIT) { data_of.order.sell_limit.number++; data_of.order.sell_limit.price_set=OrderOpenPrice(); }
if(OrderType()==OP_SELLSTOP) { data_of.order.sell_stop.number++; data_of.order.sell_stop.price_set=OrderOpenPrice(); }
}
}
}
//+------------------------------------------------------------------+
我希望你能想出办法
当你可以修改设定的价格和相对于新水平的止损和退出时,为什么要删除?
我刚刚开始学习,删除选项是为了研究函数的应用,我想知道为什么没有用。
谢谢大家的反馈。
有谁想知道外部重置命令应该是什么样子的?
它应该是什么样子的
1) 从列表中选择一组所需的条件来触发命令,例如,打开一个订单
2)订单被打开,在任何其他条件下,命令都不起作用。按票据和订单数量 过滤不是一个选项,因为原则本身应该遍布整个列表。
如果(MA1>GrossMA1 && MA2<GrossMA2 && Bid>MA1+Distanse*Point()如果GrossMA1[0], MA1[0] GrossMA2[1] MA2[1] 使用移动交叉点+移动交叉点后的距离过滤,这里的错误是什么?这个条件有多准确?
GrossMA1和GrossMA2 返回给你的东西,那里很可能有区别,你最后得到的东西 是这样的
MA1= 1.0050
if (MA1 > 0.0052) // 这不是价格本身,而是它的差异,所以它不是一个错误的比较。
GrossMA1和GrossMA2 返回给你的东西,那里很可能有区别,你最后得到的东西 是这样的
MA1= 1.0050
if (MA1 > 0.0052) // 即不是价格本身,而是它的差异,所以是一个不正确的比较。
GrossMA1和GrossMA2 返回给你的东西,那里很可能有区别,你最后得到的东西 是这样的
MA1= 1.0050
if (MA1 > 0.0052) // 即不是价格本身,而是它的差异,所以是一个不正确的比较。
FRMA2=iMA(Symbol(), 0, Faster_MA_Period, Faster_MA_Shift, Faster_MA_method, Faster_MA_Apply_to, 1);
FMA1=iMA(Symbol(), 0, Fast_MA_Period, Fast_MA_Shift, Fast_MA_method, Fast_MA_Apply_to, 0);
FMA2=iMA(Symbol(), 0, Fast_MA_Period, Fast_MA_Shift, Fast_MA_method, Fast_MA_Apply_to, 1);
GrossMA1=iMA(Symbol(), 0, Gross_MA_Period, Gross_MA_Shift, Gross_MA_method, Gross_MA_Apply_to, 0);
GrossMA2=iMA(Symbol(), 0, Gross_MA_Period, Gross_MA_Shift, Gross_MA_method, Gross_MA_Apply_to, 1);
GrossMA1和GrossMA2 返回给你的东西,那里很可能有区别,你最后得到的东西 是这样的
MA1= 1.0050
if (MA1 > 0.0052) // 即不是价格本身,而是它的差异,所以是一个不正确的比较。
很好。你能告诉我错误在哪里吗?
extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10; extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS; double x=0, z=0; int ticketUP, ticketD;
void OnTick()
{
double maxpr1=-9999; double minpr1=9999;
for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}
for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
}
一切顺利,以maxpr1的价格下了一个订单。
然后我想做同样的事,但以minpr1的价格。
double slB, tpB, slS, tpS; double x=0, z=0; int ticketUP, ticketD;
void OnTick()
{
double maxpr1=-9999; double minpr1=9999;
for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}
for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}
slS=NormalizeDouble(minpr1+pointsl*Point,5);
tpS=NormalizeDouble(minpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, minpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
}
错误130(错误停止)。我做错了什么?