포럼을 어지럽히 지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 6. - 페이지 210

 

안녕하세요.

내 전략은 스프레드 값을 고려하며 스프레드는 다음 기능에 의해 결정됩니다.

 double Spread_(){
   double spread = 0.0 ;
     RefreshRates();
     spread = MathRound ((Ask - Bid) / Point );
   return (spread);
}   

하지만 전략 테스터 의 스프레드는 일정하기 때문에 랜덤 스프레드 에뮬레이터가 필요했습니다. 테스터에서 확산 변화를 에뮬레이트하기 위해 80%의 경우에서 2에서 3포인트(4자리) 범위, 20%에서 3포인트 이상입니다. 이를 구현하는 방법에 대한 아이디어가 있거나 유사한 아이디어가 해결된 링크가 있을 수 있습니다.

 
artmedia70 :


마법의 오류는 스톱으로 닫을 때 고문이 자신의 위치가 스톱으로 닫히는 것을 보지 못한다는 사실로 이어집니다. 왜요? 답은 매직 123으로 포지션을 열고 스톱으로 청산을 확인하는 기능에 Magic 변수를 보내는 것입니다. 암시적 초기화와 동일하다고 생각하는 것은 무엇입니까? 영. 당연히 함수에서 마법이 0인 위치가 검색되고 당신의 위치는 123과 같습니다. 그리고 우리는 논쟁하지 않습니다. 하지만 그와 마찬가지로 ... 우리는 엉뚱한 주장을 합니다 ... 정지로 마감에 대한 응답을 확인하십시오.


나는 고문의 나머지 "죽은"논리를 보지 않았습니다. 나는 당신이 stop by close를 확인하는 기능을 처리하는 것을 도왔습니다...


아르템! 안녕하세요! 도움을 주셔서 다시 한 번 감사드립니다.

내가 이해하는 한 불필요한 "죽은" 논리를 모두 제거하고 나머지를 "부활"했습니다.

수정을 도와주신 기능만 거의 남겼습니다.

그런데 제 상상을 초월하는 기적이 일어나기 시작했습니다.

1. 당신의 고문이 촛불의 시작 부분에서 거래를 시작하는 형식으로 (저는 5분 있습니다)

지정된 모든 조건을 무시하면서

저것들. 컨트롤이 첫 번째 줄로 이동합니다.

이중 가격=iOpen(Symbol(),0,0);

그리고 왜 11줄을 뛰어 넘어 줄을 쳤는지

로트=0.1;

OrderSend (Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point,"jfh",123 );

2. 최소 랏을 계산하는 라인을 제거하면 Lot=MarketInfo(Symbol(), MODE_MINLOT);

EA는 잘 작동 하지만 isCloseLastPosByStop 기능이 작동하지 않습니다.

아주 오랜시간동안 엮어서 뭉쳤는데 헛수고였네요.. 오류가 어디에 숨어있는지 알려주시면 감사하겠습니다.

 double    Lot = 0.1 ;                                          //я проинициализировал переменную
int       Magic= 123 ;

int start() 
{

   double Price=iOpen( Symbol (), 0 , 0 );                       //запоминаем время открытия очередной свечи
   int ot= OrdersTotal ();                                   //запоминаем количество всех открытых ордеров
       if ((ot== 0 )                                         //если ордеров в рынке никаких нет
      &&(Bid==Price)                                     // И ПРИ ЭТОМ   если  цена = цене открытия очередной свечи
         &&(Open[ 1 ]-Close[ 1 ]> 100 * Point &&Open[ 1 ]-Close[ 1 ]< 120 * Point )      // И ПРИ ЭТОМ   если свеча N1 соответствуе этим параметрам
            &&(High[ 1 ]-Open[ 1 ]> 40 * Point &&High[ 1 ]-Open[ 1 ]< 60 * Point )       // И ПРИ ЭТОМ   если свеча N1 соответствуе этим параметрам
                &&(Close[ 1 ]-Low[ 1 ]> 40 * Point &&Close[ 1 ]-Low[ 1 ]< 60 * Point ))  // И ПРИ ЭТОМ   если свеча N1 соответствуе этим параметрам
                
                   Lot=MarketInfo( Symbol (), MODE_MINLOT);                   //вычислить минимальный лот инструмента
                               
                   if (isCloseLastPosByStop( Symbol (), OP_BUY, Magic, Lot)) //вызываем функцию,если она вернула(не понимаю-ведь функция
                     {                                                   //должна вернуть и положить сюда true или False,а здесь совсем другие передаваемые парам.)
                     t=Lot* 2 ; // удваиваем начальный лот
                     OrderSend ( Symbol (),OP_SELL,Lot,Bid, 1 ,Ask+ 1500 * Point ,Ask- 300 * Point , "jfh" , 123 );
                     }
                   else                                                     //в противном случае(если функция на вернула ??????
                     {
                     Lot= 0.1 ;                                             // лот отстается 0.1       
                     OrderSend ( Symbol (),OP_SELL, 1 ,Bid,Lot,Ask+ 1500 * Point ,Ask- 300 * Point , "jfh" , 123 );
                     }
                      
   return ( 0 );
}
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop( string sy, int op, int mn, double &ll) {
   double    pt;
   int       dg, i, j=- 1 , k=OrdersHistoryTotal()- 1 ;
   datetime t= 0 ;                                   // во избежание возможных ошибок после возможных будущих улучшений
   for (i=k; i>= 0 ; i--) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderMagicNumber()!=mn)   continue ;   // если магик не тот, переходим к следующему
         if (OrderSymbol()!=sy)         continue ;   // если символ не тот, переходим к следующему
         if (OrderType()!=op)           continue ;   // если тип не тот, переходим к следующему
         if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            j=i;
            }
         }
      }
   if ( OrderSelect (j, SELECT_BY_POS, MODE_HISTORY)) {
      dg=MarketInfo(OrderSymbol(), MODE_DIGITS);       // количество знаков в цене символа ордера
      pt=MarketInfo(OrderSymbol(), MODE_POINT);       // размер пункта инструмента в валюте котировки ордера
       if ( MathAbs (OrderClosePrice()-OrderStopLoss())< 0.5 *pt) { // Если закрыт по стопу
         ll=OrderLots();                               // записываем количество лотов в ордере, закрытом по стопу
         return ( true );                                 // возвращаем истину
         }
      }
   return (False);                                     // возвращаем ложь (позиции нету, либо не по стопу)
}


 

태양600 :

Артем ! Добрый день! Еще раз спасибо за помощь.

그는 자신의 "죽은 논리"를 모두 제거하고 나머지는 "소생"했습니다 .... 자신의 이해에 따라.

수정을 도와주신 기능만 거의 남겼습니다.

그런데 제 상상을 초월하는 기적이 일어나기 시작했습니다.

후에

 if ((ot== 0 )                                         //если ордеров в рынке никаких нет
      &&(Bid==Price)                                     //И ПРИ ЭТОМ  если  цена = цене открытия очередной свечи
         &&(Open[ 1 ]-Close[ 1 ]> 100 * Point &&Open[ 1 ]-Close[ 1 ]< 120 * Point ) //И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
            &&(High[ 1 ]-Open[ 1 ]> 40 * Point &&High[ 1 ]-Open[ 1 ]< 60 * Point )
               &&(Close[ 1 ]-Low[ 1 ]> 40 * Point &&Close[ 1 ]-Low[ 1 ]< 60 * Point ))

본문 { }에 모든 것을 추가

제가 Artem이 아니라서 죄송합니다.

 
ALXIMIKS :

태양600 :

후에

본문 { }에 모든 것을 추가

제가 Artem이 아니라서 죄송합니다.

감사합니다..처음으로 용서합니다.......(장난감이모티콘추가하는방법을모르겠습니다)
 
 t=Lot* 2 ; // удваиваем начальный лот
                     OrderSend ( Symbol (),OP_SELL,Lot,Bid, 1 ,Ask+ 1500 * Point ,Ask- 300 * Point , "jfh" , 123 );

그래서 t 또는 모두 동일한 로트 ???

 
ALXIMIKS :

태양600 :

후에

본문 { }에 모든 것을 추가

제가 Artem이 아니라서 죄송합니다.

말씀하신대로 했습니다..... 아참, 어드바이저가 작동합니다.... isCloseLastPosByStop 기능이 작동하지 않습니다

 double    Lot= 0.1 ;
int       Magic= 123 ;

int start() 
{

   double Price=iOpen( Symbol (), 0 , 0 );   //запоминаем время открытия очередной свечи
   int ot= OrdersTotal ();               //запоминаем количество всех открытых ордеров
       if ((ot== 0 )                       //если ордеров в рынке никаких нет
      &&(Bid==Price)                   //И ПРИ ЭТОМ  если ПРИ ЭТОМ  цена = цене открытия очередной свечи
         &&(Open[ 1 ]-Close[ 1 ]> 100 * Point &&Open[ 1 ]-Close[ 1 ]< 120 * Point ) //И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
            &&(High[ 1 ]-Open[ 1 ]> 40 * Point &&High[ 1 ]-Open[ 1 ]< 60 * Point )
               &&(Close[ 1 ]-Low[ 1 ]> 40 * Point &&Close[ 1 ]-Low[ 1 ]< 60 * Point ))
               
                 {
                  Lot=MarketInfo( Symbol (), MODE_MINLOT);             //вычислить минимальный лот инструмента
                               
                   if (isCloseLastPosByStop( Symbol (), OP_BUY, Magic, Lot)) //вызываем функцию,если она вернула(не понимаю-ведь функция
                     {                             //должна вернуть и положить сюда true или False,а здесь совсем другие передаваемые парам.)
                     Lot=Lot* 2 ; // удваиваем начальный лот
                     OrderSend ( Symbol (),OP_SELL,Lot,Bid, 1 ,Ask+ 1500 * Point ,Ask- 300 * Point , "jfh" , 123 );
                     }
                   else    //в противном случае(если функция на вернула??????
                     {
                     Lot= 0.1 ; // лот отстается 0.1       
                     OrderSend ( Symbol (),OP_SELL, 1 ,Bid,Lot,Ask+ 1500 * Point ,Ask- 300 * Point , "jfh" , 123 );
                     }
                      } 
   return ( 0 );
}
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop( string sy, int op, int mn, double &ll) {
   double    pt;
   int       dg, i, j=- 1 , k=OrdersHistoryTotal()- 1 ;
   datetime t= 0 ;                                   // во избежание возможных ошибок после возможных будущих улучшений
   for (i=k; i>= 0 ; i--) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderMagicNumber()!=mn)   continue ;   // если магик не тот, переходим к следующему
         if (OrderSymbol()!=sy)         continue ;   // если символ не тот, переходим к следующему
         if (OrderType()!=op)           continue ;   // если тип не тот, переходим к следующему
         if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            j=i;
            }
         }
      }
   if ( OrderSelect (j, SELECT_BY_POS, MODE_HISTORY)) {
      dg=MarketInfo(OrderSymbol(), MODE_DIGITS);       // количество знаков в цене символа ордера
      pt=MarketInfo(OrderSymbol(), MODE_POINT);       // размер пункта инструмента в валюте котировки ордера
       if ( MathAbs (OrderClosePrice()-OrderStopLoss())< 0.5 *pt) { // Если закрыт по стопу
         ll=OrderLots();                               // записываем количество лотов в ордере, закрытом по стопу
         return ( true );                                 // возвращаем истину
         }
      }
   return (False);                                     // возвращаем ложь (позиции нету, либо не по стопу)
}
 

다음은 bool isCloseLastPosByStop( string sy, int op, int mn, double &ll) 함수의 코드입니다.

미끄러짐이 3핍이면? 어떻게 든 생각하지 않았습니다))

 if ( MathAbs (OrderClosePrice()-OrderStopLoss())< 0.5 *pt) { // Если закрыт по стопу
         ll=OrderLots();                               // записываем количество лотов в ордере, закрытом по стопу
         return ( true );                                 // возвращаем истину
 
solnce600 :

당신은 이해합니다 - 나는 아직 이것을 귀찮게하지 않습니다 ....

일주일 내내 나는 왜 이 기능이 내가 필요로 하는 대로 작동하지 않는지 이해할 수 없습니다.

즉, 스톱 후에는 스톱으로 마감된 주문의 볼륨의 두 배의 볼륨으로 다음 주문을 열어야 하고, 스톱이 없으면 다음 주문은 평소 볼륨으로 열립니다.


작업 논리를 수정하지 않으면 생각하는 데 오랜 시간이 걸립니다.
 
ALXIMIKS :

다음은 bool isCloseLastPosByStop( string sy, int op, int mn, double &ll) 함수의 코드입니다.

미끄러짐이 3핍이면? 어떻게 든 생각하지 않았습니다))


당신은 이해합니다 - 나는 아직 이것을 귀찮게하지 않습니다 ....

일주일 내내 나는 왜 이 기능이 내가 필요로 하는 대로 작동하지 않는지 이해할 수 없습니다.

즉, 스톱 후에는 스톱으로 마감된 주문의 2배의 볼륨으로 다음 주문을 열어야 하고, 논스톱 후에는 다음 주문이 평소 볼륨으로 열립니다.
 

그리고 왜 주문의 역사를 만지는가 ? 저울을 보세요 - 그 방향으로 어디로 가셔서 많이 바꾸셨어요.

로봇만 인터넷 거래를 한다면.