[存档!]任何菜鸟问题,为了不使论坛变得混乱。专业人士,不要路过。没有你,哪里都不能去 - 4. - 页 277

 
evillive:

下午好!

如果有的话,请告诉我一个可靠的方法来识别一个单位。

有的。 我这周也是根据它来收费的,是真的。
 
evillive:

下午好!
如果有的话,请告诉我一个可靠的方法来识别一个单位。

扁平是指由一个或多个扁平元素组成的价格运动。
扁平元素是指当价格从其起点向任何方向移动时形成的价格运动元素, ,随后价格回调至此点。

 

对于订单的交付,使用以下命令

tikett= OrderSend( Symbol(), OP_SELLSTOP,  volume*A, Price -otstup*Point, Point* 3,R2, Price-takeprofit*Point-otstup*Point, "OP_SELLSTOP" , 2000,  expiration,C'0,128,255' );

命令OrderSend命令机器人下单;货币对写在括号中的第一个位置 这里我们有 Symbol(),它给我们提供了放置专家顾问的货币对。随后是贸易业务 的名称。然后,我们有很多数量,我们在这里有一个可变的乘数。价格,然后是3个点的偏差,止损,止盈,名称,神奇的数字--你选择的任何数字,然后我不记得了,然后是颜色。一切都是按照这个顺序。你可以不用tikett=,只用OrderSend。

在这里,请注意!如果只是写在开始的时候,订单会在每一个刻度上下达,最多可达数百个订单。我们需要条件,以便在必要时下订单。例子。

for ( i=OrdersTotal();i>0;i--){ OrderSelect(i-1,SELECT_BY_POS );//Alert ("OrderType( )", OrderType( ));
 if( OrderMagicNumber( )==2000 &&OrderSymbol()==Symbol()) { 
if(OrderType( ) ==OP_SELLSTOP) { Y++;}
if(OrderType( ) ==OP_SELL) { Y++;}}}
Y=Y-dolivka1;//Alert ("Y++", Y," dolivka1 ",dolivka1);
 if (Y<=0){ // Alert ("Y", Y );
   tikett= OrderSend( Symbol(), OP_SELLSTOP,  volume*A, Price -otstup*Point, Point* 3,R2, Price-takeprofit*Point-otstup*Point, "OP_SELLSTOP" , 2000,  expiration,C'0,128,255' );
   // Alert ("OP_SELLSTOP", GetLastError( )); 
    Error=GetLastError( ); } J=0;

   if (Error !=0 ) { Print ( " Error OP_SELLSTOP " , Error , "tikett",tikett," volume*A ",volume*A," Price -otstup*Point ",Price -otstup*Point," Price-takeprofit*Point-otstup*Point ",Price-takeprofit*Point-otstup*Point, 
  " Ask ", Ask , " Bid " , Bid );
   Error=0;}

累了。使用帮助,分析准备好的例子。

 
drknn:


你在这里看到过吗?https://book.mql4.com/ru/samples/index

一般来说,像其他程序一样,你的程序将由独立的块组成,每个块执行一个任务。我们拿一个这样的区块来写我们自己的代码,从头到尾进行调试,然后转到下一个区块。就这样一直到节目结束。


好吧,我会试着更具体一些......。我的专家顾问成功地打开了一个挂单,但在一段时间后,它必须修改它...要做到这一点,我需要知道它的索引或挂单中的一个位置号。我怎样才能获得这个位置号或其索引?我们必须用for循环来搜索订单吗?我有一个订单... 以下是我的程序中不工作的部分代码


如果(OrderSelect (1, SELECT_BY_POS, MODE_TRADES)==true)

{ticket = OrderTicket();

return();}

我应该如何正确书写?

 
AlexLaptist:


然而,我将尝试更准确地提出这个问题......我的专家顾问成功地打开了一个挂单,一段时间后,它必须修改它...要做到这一点,我们需要知道它的索引或挂单中的一个位置号。我怎样才能获得这个位置号或其索引?我们必须用for循环来搜索订单吗?我有一个订单...以下是我的程序中不工作的部分代码


如果(OrderSelect (1, SELECT_BY_POS, MODE_TRADES)==true)

{ticket = OrderTicket();

return();}

我怎样才能正确书写?


函数OrderSend() 如果成功执行,将返回它刚刚打开的订单的票号--这是它在服务器上的序列号,而且没有其他这样的订单。所以没有必要对订单进行回调,只要记住它的票。只要一打开订单就能记住它。

int Ticket=OrderSend();
if(Ticket<0){
// тут принтуем сообщение об ошибке.
}
// Вам нужно всё равно создать счётчик ордеров, который обнулит переменную Ticket в том случае, если ордера в рынке больше нет.
 
drknn:


OrderSend()函数,如果成功执行,将返回它刚刚打开的订单票号--这是它在服务器上的序列号,而且没有其他这样的订单。所以没有必要对订单进行回调,只要记住它的票。只要一打开订单就能记住它

而我们会'记住'他多久呢?你可能会失去它...

IMHO - 我们应该在需要的时候总是采取新鲜和最新的信息,而不是把它储存在记忆中,取决于场合。

与其寄希望于机会,还不如在修改前找到正确的顺序...以防万一没有关闭电源,例如...

 
AlexLaptist:


然而,我将尝试更准确地提出这个问题......我的专家顾问成功地打开了一个挂单,一段时间后,它必须修改它...要做到这一点,我们需要知道它的索引或挂单中的一个位置号。我怎样才能获得这个位置号或其索引?我们必须用for循环来搜索订单吗?我有一个订单...以下是我的程序中不工作的部分代码


如果(OrderSelect (1, SELECT_BY_POS, MODE_TRADES)==true)

{ticket = OrderTicket();

return();}

我怎样才能正确书写?

也许它是这样的。

//+----------------------------------------------------------------------------+
int TicketLastSetOrder(string sy, int mn) { // 
   datetime t;
   int      i, op, ticket=-1;
   for (i=0; i<OrdersTotal(); i++) {
      if (OrderSelect(i, SELECT_BY_POS)) {
         op=OrderType();
         if (OrderMagicNumber()!=mn)   continue;
         if (OrderSymbol()!=sy)        continue;
         if (op<2 || op>5)             continue;
         if (OrderOpenTime()>t)  {
            t=OrderOpenTime();
            ticket=OrderTicket();
            }
         }
      else Print("FUNC TicketLastSetOrder(): Error select order: "+GetLastError());
      }
   return(ticket);
}
//+----------------------------------------------------------------------------+

返回最后一个定单的票据或-1

打电话时,请说明所需的符号和EA的magik,例如:。

   int TicketMyOrder=TicketLastSetOrder(Symbol(), Magic);

这个函数将返回在当前符号(在你的情况下是唯一的一个) 的最后一个挂单 的票。魔法 - 你的EA的魔法数字

 

你也可以把票放在全局变量 中。:)你根本就可以滚蛋了。但作为一个想法,在修改前选择顺序会有效果。只有在没有必要在订单的所有时间内只重置一次手数的情况下(只做一次修改):):)。

简而言之,有很多变种 :)

 

请给我一个提示。我还没有完全弄清楚指标是如何工作的。当我改变时间框架时,我的指标没有绘制,而且每隔一段时间就会绘制一次。但有时确实如此,而且它完全按照我的意愿工作!"。 请告诉我它需要什么。

//+------------------------------------------------------------------+
//|                                            ИндюкДимонакомпил.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#import "user32.dll"
   int   PostMessageA(int  hWnd,int  Msg,int  wParam,string lParam);
#import
#define WM_COMMAND                     0x0111
int delimiter = 0;

#property indicator_chart_window

#property indicator_buffers 3
#property indicator_color1 Green
#property indicator_color2 Red
#property indicator_color3 DarkBlue
double ВерхняячертаBuffer1[];
double НижняячертаBuffer2[];
double СинняячертаBuffer3[];
 double вершина; 
 double основание_первого_снижения;
 double начало;
 double вершина_волны_3;
 extern int T=4,K=200;
 int timeframe, start ;
 int бар_вершина ;
 int бар_основание_первого_снижения;
 int бар_начало;
int pereklutsatel;
double naklon,linija2; int P;extern int RO=-1;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators

SetIndexStyle(0,DRAW_SECTION,STYLE_SOLID,2,CLR_NONE);//Alert ("SetIndexStyle ",GetLastError( ) );
  SetIndexBuffer(0,ВерхняячертаBuffer1);//Alert ("SetIndexBuffer ",GetLastError( ) );
   SetIndexEmptyValue(0,0.0);
   
   SetIndexStyle(1,DRAW_SECTION,STYLE_SOLID,2,CLR_NONE);//Alert ("SetIndexStyle ",GetLastError( ) );
  SetIndexBuffer(1,НижняячертаBuffer2);//Alert ("SetIndexBuffer ",GetLastError( ) ); 
   SetIndexEmptyValue(1,0.0);
   
   SetIndexStyle(2,DRAW_SECTION,STYLE_SOLID,T,CLR_NONE);//Alert ("SetIndexStyle ",GetLastError( ) );
  SetIndexBuffer(2,СинняячертаBuffer3);//Alert ("SetIndexBuffer ",GetLastError( ) ); 
   SetIndexEmptyValue(2,0.0);
   
   
  ObjectDelete("вершина");
  ObjectDelete("основание_первого_снижения  ");
   ObjectDelete("начало");
    ObjectDelete("точка4");
    ObjectDelete("пятая_точка!");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   ObjectDelete("вершина");
  ObjectDelete("основание_первого_снижения  ");
   ObjectDelete("начало");
    ObjectDelete("точка4");
    ObjectDelete("пятая_точка!");
   ObjectsDeleteAll(WindowOnDropped( ) , OBJ_TEXT);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int limit=Bars-counted_bars-1;

   for (int i=limit;i>=0;i--) {
//----
 for ( int J=0;J<=RO;J++){
//----

  // for(int i=Bars; i>=0;i--)
   i=Bars;
      бар_вершина=iHighest( NULL,  timeframe, MODE_HIGH, K, start ) ;
       вершина =High[ бар_вершина ];
       бар_основание_первого_снижения=iLowest( NULL,  timeframe, MODE_LOW,NormalizeDouble ( бар_вершина/2,0), start ) ;
       основание_первого_снижения=Low[ бар_основание_первого_снижения ];
       бар_начало=iLowest( NULL,  timeframe, MODE_LOW,NormalizeDouble (бар_вершина*1.5,0), бар_вершина ) ;
       начало=Low[ бар_начало ];
       
   ObjectCreate( "вершина",  OBJ_TEXT , WindowOnDropped( ) , Time[бар_вершина],  вершина+(10*Point)) ; 
    ObjectSetText( "вершина", "вершина", 5, "вершина",Crimson ) ;// Alert("GetLastError()",GetLastError());
      // ObjectSet(  "вершина",  OBJPROP_COLOR, Crimson) ;
      
   ObjectCreate( "основание_первого_снижения",  OBJ_TEXT , WindowOnDropped( ) , Time[бар_основание_первого_снижения],  основание_первого_снижения-(10*Point)) ; 
    ObjectSetText( "основание_первого_снижения", "основание_первого_снижения", 5, "основание_первого_снижения",Crimson ) ;   
   
    ObjectCreate( "начало",  OBJ_TEXT , WindowOnDropped( ) , Time[бар_начало],  начало-(10*Point)) ; 
    ObjectSetText( "начало", "начало", 5, "начало",Crimson ) ;   
           
  if(начало>основание_первого_снижения){naklon=(начало-основание_первого_снижения)/(бар_начало-бар_основание_первого_снижения);
 // Alert("naklon  ", naklon);
    НижняячертаBuffer2[бар_начало]=начало;linija2=начало;for(i=бар_начало-1;i>=0;i--){linija2=linija2-naklon;
   
    НижняячертаBuffer2[i]=linija2;  // Alert ("linija2  " , linija2 ); 
     Alert("НижняячертаBuffer2[i]  ", НижняячертаBuffer2[i] , "  i " , i);
     
   }
    НижняячертаBuffer2[бар_основание_первого_снижения]=основание_первого_снижения;}
    
    
         for (i=0;i<100;i++){  СинняячертаBuffer3[i]= Open[i];}
          for (i=330;i<500;i++){  СинняячертаBuffer3[i]= Open[i];}

     ВерхняячертаBuffer1[бар_начало]=начало;
     
 double точка4; int бар_точка4;   бар_точка4=iHighest( NULL,  timeframe, MODE_HIGH, бар_основание_первого_снижения, 3 ) ; 
  точка4 =High[ бар_точка4 ];  
   
   if(вершина>точка4){naklon=(начало-точка4)/(бар_начало-бар_точка4);
   ObjectCreate( "точка4",  OBJ_TEXT , WindowOnDropped( ) , Time[бар_точка4],  точка4+(10*Point)) ; 
    ObjectSetText( "точка4", "точка4", 5, "точка4",Crimson ) ;  
   double linija1=начало;for(i=бар_начало-1;i>=0;i--){linija1=linija1-naklon;ВерхняячертаBuffer1[i]=linija1; }}
   
double vulf=НижняячертаBuffer2[0];
  if ( vulf==Ask||vulf==Bid){vulf=1;}
 if (vulf+(10*Point)>Ask&&vulf-(10*Point)<Bid){vulf=1 ;} 
           
      Alert ("vulf  " , vulf );   Comment ("  vulf!!! "  , vulf);  
   if (vulf==1){Comment ("  Есть вульв!!! "  , "  timeframe " , timeframe);
   ObjectCreate( "пятая_точка!",  OBJ_TEXT , WindowOnDropped( ) , Time[0],  Bid-(10*Point)) ; 
    ObjectSetText( "пятая_точка!", "пятая_точка!", 5, "пятая_точка!",Crimson ) ;   return(0);  }
    if (vulf!=1) {    
   
     if(delimiter<3){delimiter++;Comment(delimiter);return(0);}
   delimiter=0;
    fChangePeriod();P++;
                                 
                   }  } }
//----
   return(0);
  }
//+------------------------------------------------------------------+

void fChangePeriod(){int ii,hwd = WindowHandle(Symbol(),Period());
   switch(Period()){
      case PERIOD_W1    : ii = 33134; break; //PERIOD_D1;
      case PERIOD_D1    : ii = 33136; break; //PERIOD_H4;
      case PERIOD_H4    : ii = 33135; break; //PERIOD_H1;
      case PERIOD_H1    : ii = 33140; break; //PERIOD_M30;
      case PERIOD_M30   : ii = 33139; break; //PERIOD_M15;
      case PERIOD_M15   : ii = 33138; break; //PERIOD_M5;
      case PERIOD_M5    : ii = 33137; break; //PERIOD_M1;
      case PERIOD_M1    : ii = 33141; break; //PERIOD_W1;
   }     
   PostMessageA(hwd, WM_COMMAND, ii, 0);
   return;
}
 
drknn:

你也可以把票放在全局变量中。:)你根本就可以滚蛋了。但作为一个想法,在修改前选择顺序会有效果。只有在没有必要在整个订单有效期内只重置1次手数的情况下(只做一次修改):):)。

简而言之,有很多变种 :)。

你也可以在全球范围内这样做。但终端在关闭前会将它们写进一个文件(如果我没记错的话)。也就是说,它不能避免在意外断电时的票据损失。

到目前为止,我没有看到一个比在你需要时直接从服务器上获取数据更可靠的方法。