[ARCHIVE] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 5. - 페이지 192

 
artmedia70 :
Igor Kim에는 주어진 시간 간격 후에 다음을 수행하는 고문 이 있습니다.


고맙습니다!
 

안녕하세요.

특히 만료 날짜와 관련된 보류 중인 주문 문제.

   ticket= OrderSend (symb, OP_SELLLIMIT, Lots, price, Slippage, 0 , 0 , lsComm, mn, TimeCurrent () + 60 * 60 , op_color);

이것은 새로운 주문이 열리는 방식입니다. 즉, 한 시간 동안 작동하지 않으면 서버는 주문을 닫아야 합니다.

다음으로 만료 날짜가 어떻게 되었는지 확인합니다.

   if (ticket> 0 )
   {
     OrderSelect (ticket, SELECT_BY_TICKET);
     Alert ( "OrderExpiration = " , TimeToStr(OrderExpiration(), TIME_DATE), ":" ,TimeToStr(OrderExpiration(), TIME_MINUTES)); 
.......
   } 

Expert Advisor가 테스터에서 작동할 때 얻는 것:

2013.03.01 12:45:58 2012.01.11 11:00 #EA# EURUSD,H1: 1위 매도 한도 2.00 EURUSD at 1.27972 ok
2013.03.01 12:45:58 2012.01.11 11:00 #EA# EURUSD,H1: 경고: 주문 만료 = 2012.01.11:12:00
2013.03.01 12:45:58 2012.01.12 16:29 테스터: 주문 1번, 2.00 EURUSD 매도 1.27972에서 시작

즉, 만료 날짜와 시간이 내가 원하는대로 올바르게 설정되었지만 만료 시간까지 마감이 없습니다. 하루 이상으로 포지션이 열립니다.

이미 여러 포럼을 검색했는데 문제가 발생합니다. 일반적인 대답은 "저를 위해 일합니다" 또는 "자신을 모니터링합니다"입니다. 두 답변 모두 적합하지 않으며, 직접 추적하고 싶지도 않으며, 저에게도 적합하지 않습니다.

 
artmedia70 :
Igor Kim에는 주어진 시간 간격 후에 다음을 수행하는 고문 이 있습니다.

잘 작동합니다.

팁 고마워!

 
DhP :

잘 작동합니다.

팁 고마워!


내가 아니라 구글이다.

나는 당신이 거기에서 화면 저장 기능을 꺼내고 그것을 호출하기 위해 자신의 매개 변수를 설정했다고 생각합니다. 나는 너무 게으르다 ...

 
borilunad :
세르게이! 지금은 기능에 대한 질문을 열어 둡니다. 왜냐하면 내일 나는 순수한 실험을 수행하기 위해 테스트 EA에 몇 가지 기능을 더 삽입할 것입니다. 나는 시각 모드에서 그것을 보았고 거의 항상 이중 닫기가 마지막으로 발생하고 SL과 TP에 의해 더 일찍 닫힙니다. 선택할 것이 없습니다. 선택할 수 있는 발과 테이키를 제거했습니다. 내일 나는 모든 추가 기능과 의견으로 고문을 보여줄 것입니다! 기능이 어떻게 작동하는지 직접 확인할 수 있습니다. 내가 틀렸다는 걸 정말 보여주고 싶어요! 내가 옳다면 내가 원하는 것을 달성하기 위해 노력할 것입니다! 내일까지!

Sergey, Dubakin , 좋은 아침(나를 위해) 그리고 좋은 오후(당신을 위해)! 나는 육안으로 확인했고 이 기능이 내가 원하는 최대값을 선택하는지 확인했습니다! 더 이상 의심하지 않아 기쁩니다. 죄송합니다! 그러나 우리 비즈니스에서는 "7번 측정하는 것이 더 낫습니다..." 더 명확한 시각적 확인을 위해 추가된 기능과 설명과 함께 기능을 테스트하기 위해 테스터 EA를 보여주고 있습니다! 고맙습니다!

 extern int EA_Magic= 135 ; // внешняя переменная

int TimeNow, TimePrev, PrevType; // глобальные переменные

int start()
{
   double Price,SL,TP;
     int Ticket;

  TimeNow=iTime( NULL , 240 , 0 );
   if (TimePrev==TimeNow) return ( 0 );

   if (PrevType!= 1 ) {
   Price= NormalizeDouble (Ask, Digits );    
//   SL=NormalizeDouble(Price-300*Point,Digits);    
//   TP=NormalizeDouble(Price+300*Point,Digits);
   Ticket= OrderSend ( Symbol (),OP_BUY, 0.1 ,Price, 3 , 0 , 0 , "" ,EA_Magic);
   if (Ticket!=- 1 ) { TimePrev=TimeNow; PrevType= 1 ; } }

   else if (PrevType!=- 1 ) {
   Price= NormalizeDouble (Bid, Digits );    
//   SL=NormalizeDouble(Price+300*Point,Digits);    
//   TP=NormalizeDouble(Price-300*Point,Digits);
   Ticket= OrderSend ( Symbol (),OP_SELL, 0.1 ,Price, 3 , 0 , 0 , "" ,EA_Magic);
   if (Ticket!=- 1 ) { TimePrev=TimeNow; PrevType=- 1 ; } }

   Comment ( "BuyPos: " ,NumberOfBuyPositions(), "; SellPos: " ,NumberOfSellPositions(),
  "; LotPos: " ,GetAmountLotFromOpenPos(),
   "\nMaxLoss: " ,DoubleToStr(GetMinProfit(), 2 ), "; MaxProf: " ,DoubleToStr(GetMaxProfit(), 2 ),
   "\nLossDiff: " ,DoubleToStr(GetMinProfit()+GetMaxProfit(), 2 ));

   if (Hour()== 0 && TimePrev==TimeNow) LockOFF(EA_Magic);

   return ( 0 );
}

bool LockOFF( int EA_Magic) {
   double Result, PrevLoss, PrevProfit;
     int pos, orders_total, order_type, MaxProfitTicket, MaxLossTicket;
     bool Ans;

  MaxProfitTicket=- 1 ; MaxLossTicket=- 1 ;

  orders_total= OrdersTotal ();
   for (pos=orders_total- 1 ; pos>= 0 ; pos--) {
     if (! OrderSelect (pos, SELECT_BY_POS, MODE_TRADES)) continue ;
     if (OrderSymbol()!= Symbol () || OrderMagicNumber()!=EA_Magic) continue ; // не наш ордер
     if (OrderType()> 1 ) continue ;
    Result=OrderProfit()+OrderSwap()+OrderCommission();
     if (Result< 0.0 && (PrevLoss== 0.0 || Result<PrevLoss)) {
      PrevLoss=Result; MaxLossTicket=OrderTicket(); order_type=OrderType();   // end of for
  } }
   if (MaxLossTicket==- 1 ) return ( false ); // нет убыточной позиции
   if (order_type==OP_BUY) order_type=OP_SELL; else order_type=OP_BUY; 

  orders_total= OrdersTotal ();
   for (pos=orders_total- 1 ; pos>= 0 ; pos--) {
     if (! OrderSelect (pos, SELECT_BY_POS, MODE_TRADES)) continue ;
     if (OrderSymbol()!= Symbol () || OrderMagicNumber()!=EA_Magic) continue ; // не наш ордер
     if (order_type!=OrderType()) continue ;
    Result=OrderProfit()+OrderSwap()+OrderCommission();
     if (Result> 0.0 && (PrevProfit== 0.0 || Result>PrevProfit)) {
      PrevProfit=Result; MaxProfitTicket=OrderTicket();   // end of for
  } }
   if (MaxProfitTicket==- 1 ) return ( false ); // нет противоположной прибыльной позиции

  Ans=OrderCloseBy(MaxLossTicket, MaxProfitTicket);
   if (!Ans) { 
     Print ( "Ошибка при встречном закрытие!" ); return ( false ); 
  }
   return ( true ); 
}
//+----------------------------------------------------------------------------+
int NumberOfBuyPositions( string sy= "" , int op=- 1 , int mn=- 1 ) {
   int i, k= OrdersTotal (), kp= 0 ;
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
       if (OrderType()==OP_BUY) {
         if (op< 0 || OrderType()==op) {
          kp++;
  } } } }
   return (kp);
}
//+----------------------------------------------------------------------------+
int NumberOfSellPositions( string sy= "" , int op=- 1 , int mn=- 1 ) {
   int i, k= OrdersTotal (), kp= 0 ;
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
       if (OrderType()==OP_SELL) {
         if (op< 0 || OrderType()==op) {
          kp++;
  } } } }
   return (kp);
}
//+----------------------------------------------------------------------------+
double GetAmountLotFromOpenPos( string sy= "" , int op=- 1 , int mn=- 1 ) {
   double l= 0 ;
   int     i, k= OrdersTotal ();
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
       if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
         if (op< 0 || OrderType()==op) {
          l+=OrderLots();
  } } } }
   return (l);
}
//+----------------------------------------------------------------------------+
double GetMinProfit( string sy= "" , int op=- 1 , int mn=- 1 ) {
   double p;
   int     i, k= OrdersTotal ();
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
       if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
         if (op< 0 || OrderType()==op) {
           if (p>OrderProfit()+OrderCommission()+OrderSwap())
          p=OrderProfit()+OrderCommission()+OrderSwap();
  } } } }
   return (p);
}
//+----------------------------------------------------------------------------+
double GetMaxProfit( string sy= "" , int op=- 1 , int mn=- 1 ) {
   double p;
   int     i, k= OrdersTotal ();
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
       if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
         if (op< 0 || OrderType()==op) {
           if (p<OrderProfit()+OrderCommission()+OrderSwap())
          p=OrderProfit()+OrderCommission()+OrderSwap();
  } } } }
   return (p);
}
//+----------------------------------------------------------------------------+
 
borilunad :

Sergey, Dubakin , 좋은 아침(나를 위해) 그리고 좋은 오후(당신을 위해)! 나는 육안으로 확인했고 이 기능이 내가 원하는 최대값을 선택하는지 확인했습니다! 더 이상 의심하지 않아 기쁩니다. 죄송합니다! 그러나 우리 비즈니스에서는 "7번 측정하는 것이 더 낫습니다..." 더 명확한 시각적 확인을 위해 추가된 기능과 설명과 함께 기능을 테스트하기 위해 테스터 EA를 보여주고 있습니다! 고맙습니다!

그렇구나...뭔가 김이고르를 기준으로 한건데...네 기능 중 하나만...나머지는 똑같네...

 //+----------------------------------------------------------------------------+
int NumberOfBuyPositions( string sy= "" , int op=- 1 , int mn=- 1 ) { // для чего присвоены значения по-умолчанию, если они нигде не используются? Кроме op (и то неверно)
   int i, k= OrdersTotal (), kp= 0 ;
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
       if (OrderType()==OP_BUY) {                               // тут жесткая проверка на тип Buy
         if (op< 0 || OrderType()==op) {                         // тут лишняя проверка на значение op, используемое по умолчанию и ещё одна лишняя проверка на ==op
          kp++;
  } } } }
   return (kp);
}
//+----------------------------------------------------------------------------+

아마도 다음과 같습니다.

 //+----------------------------------------------------------------------------+
int NumberOfPositions( string sy, int op, int mn) {
   int i, k= OrdersTotal ()-1, kp= 0 ;
   for (i=k; i>=0; i--) {
   if ( OrderSelect (i,SELECT_BY_POS)) {           // если ордер выбран
       if (OrderMagicNumber()!=mn)   continue ;    // если не наш магик - смотрим следующий ордер
       if (OrderSymbol()!=sy)         continue ;    // если не наш символ - смотрим следующий ордер
       if (OrderType()!=op)           continue ;    // если не соответствует тип - смотрим следующий
      kp++;                                      // тут искомый ордер - увеличим счётчик
      }
   }
   return (kp);
}
//+----------------------------------------------------------------------------+

그리고 우리는 그것을 호출합니다:

Magic을 사용하여 현재 기호에 대한 매수 및 매도 계산

 //+----------------------------------------------------------------------------+
   int BuyPos= NumberOfPositions( Symbol (), OP_BUY,  Magic);
   int SellPos=NumberOfPositions( Symbol (), OP_SELL, Magic);
//+----------------------------------------------------------------------------+
 
alsu :
파샤5282:
모든 미결 거래 중에서 가장 작은 로트를 선택하는 방법을 알려주십시오.

int i, ot = OrdersTotal();
이중 최소 = 0;
정수 min_ticket=0;
for(i=0;i<ot;i++)
{
if(!OrderSelect(i,SELECT_BY_POS)) 계속;
if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) 계속;
if(i==0||min>OrderLots()) {min = OrderLots(); min_ticket=OrderTicket();}
}


실을 살펴보았습니다. 당신의 논리가 이상합니다. 코드의 마지막 줄에 관심이 있습니다.

 if (i== 0 ||min>OrderLots()) {min = OrderLots(); min_ticket=OrderTicket();
변수 i 는 루프의 시작 부분에서만 값 0 을 갖습니다. 그런 다음 각 반복마다 값을 1 씩 추가합니다.

그런 다음 사이클을 계속하려면 다음과 같은 조건이 있습니다.

min>OrderLots()
그러나 min 은 0으로 선언되고 코드의 다른 곳에서는 값이 변경되지 않습니다. 그리고 이것은 이 값이 결코 사실이 아님을 의미합니다! 논리는 어디에 있습니까?
 
hoz :


실을 살펴보았습니다. 당신의 논리가 이상합니다. 코드의 마지막 줄에 관심이 있습니다.

변수 i 는 루프 시작 부분에서만 값 0 을 갖습니다. 그런 다음 각 반복마다 값을 1 씩 추가합니다.

그런 다음 주기를 계속하려면 다음과 같은 조건이 있습니다.

그러나 min 은 0으로 선언되고 코드의 다른 곳에서는 값이 변경되지 않습니다. 그리고 이것은 이 값이 결코 사실이 아님을 의미합니다! 논리는 어디에 있습니까?

 int i, ot = OrdersTotal ();
double min= 0.0 ;
int min_ticket= 0 ;
for (i= 0 ;i<ot;i++)
{
if (! OrderSelect (i,SELECT_BY_POS)) continue ;
if (OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue ;
if ( min== 0.0 ||min>OrderLots()) {min = OrderLots(); min_ticket=OrderTicket();}
}
이렇게하면 모든 이상한 것이 사라질 것입니다.
 
hoz :


실을 살펴보았습니다. 당신의 논리가 이상합니다. 코드의 마지막 줄에 관심이 있습니다.

변수 i 는 루프 시작 부분에서만 값 0 을 갖습니다. 그런 다음 각 반복마다 값을 1 씩 추가합니다.

그런 다음 주기를 계속하려면 다음과 같은 조건이 있습니다.

그러나 min 은 0으로 선언되고 코드의 다른 곳에서는 값이 변경되지 않습니다. 그리고 이것은 이 값이 결코 사실이 아님을 의미합니다! 논리는 어디에 있습니까?

노트

 if (i== 0 ||min>OrderLots()) { min = OrderLots() ; min_ticket=OrderTicket();

  min>OrderLots()이면 min = OrderLots();

 
r772ra :

노트

  min>OrderLots()이면 min = OrderLots();

min이 0이면 OrderLots()보다 커질 수 없습니다.