STOP

O jezykach programowania w platformach i nie tylko.
MŁA
Bywalec
Bywalec
Posty: 14
Rejestracja: 17 lis 2011, 19:56

STOP

Nieprzeczytany post autor: MŁA »

Witam mam tu problem ze stopem może ktoś z was by wiedział gdzie popełniam błąd? całość działa mi dobrze prócz OrderClose, robot zachowuje się jakby nie było tej części kodu
void CheckForOpen()
{
int q;// określenie czasu rozpoczęcia transakcji

int res;// początek części kodu co działa
if(Volume[0]>1)
return;
if(Close[1]>Close[90])
{
SL=0;TP=0;
if(StopLoss>0)
SL=Ask-Point*StopLoss;
if(TakeProfit>0)
TP=Ask+Point*TakeProfit;
res=WHCOrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,SL,TP,"MACD",MAGICMA,0,BuyColor);
q=TimeCurrent();//q jest liczbą sekund od 1970 do otwarcia pozycji
if(res<0)
{
Print("Error when opening a BUY order #",GetLastError());
Sleep(10000);
return;
}
}//koniec części kodu co działa
if(OrderSelect(MAGICMA, SELECT_BY_TICKET)==true)// wybieram transakcje
{
if((TimeCurrent()-q)>180) // jeśli aktualny czas w sekundach - czas otwarcia pozycji > 180 sekund
{
OrderClose( MAGICMA,1,Ask,3,Red); // zamknij transakcje
}
}
}
Całość wygląda logicznie robot otwiera i zamyka transakcje gdy jest spełniony warunek po TP i SL a na czas już nie "zwraca uwagi"

JAREK67
Maniak
Maniak
Posty: 2143
Rejestracja: 13 lip 2006, 11:21

Re: STOP

Nieprzeczytany post autor: JAREK67 »

Kod: Zaznacz cały

void CheckForOpen()
{
int q;// określenie czasu rozpoczęcia transakcji

int res;// początek części kodu co działa
if(Volume[0]>1)
return;
if(Close[1]>Close[90])
{ 
SL=0;TP=0;
if(StopLoss>0)
SL=Ask-Point*StopLoss;
if(TakeProfit>0)
TP=Ask+Point*TakeProfit;
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,SL,TP,"MACD",MAGICMA,0,BuyColor);
q=TimeCurrent();//q jest liczbą sekund od 1970 do otwarcia pozycji
if(res<0)
{
Print("Error when opening a BUY order #",GetLastError());
Sleep(10000);
return;
}
}//koniec części kodu co działa
if(OrderSelect(OrderTicket(), SELECT_BY_TICKET)==true)// wybieram transakcje
{ 
if((TimeCurrent()-OrderOpenTime())>180) // jeśli aktualny czas w sekundach - czas otwarcia pozycji > 180 sekund
{
OrderClose( OrderTicket(),OrderLots(),Bid,3,Red); // zamknij transakcje
}
}
}

Spróbuj tego

MŁA
Bywalec
Bywalec
Posty: 14
Rejestracja: 17 lis 2011, 19:56

Re: STOP

Nieprzeczytany post autor: MŁA »

widzę że usunąłeś q i MAGICMA i zastąpiłeś to OrderTicket() i OrderOpenTime() też próbowałem podobną kombinacje ale uznałem że to nie jest zbyt jasne co jest co dla programu i dlatego to co podałeś zmodyfikowałem do mojej formy ale tak czy siak obydwa kody mi nie działają tak jak wspominałem wyżej tak jakby tych linijek kodu by nie było

JAREK67
Maniak
Maniak
Posty: 2143
Rejestracja: 13 lip 2006, 11:21

Re: STOP

Nieprzeczytany post autor: JAREK67 »

MŁA pisze:widzę że usunąłeś q i MAGICMA i zastąpiłeś to OrderTicket() i OrderOpenTime() też próbowałem podobną kombinacje ale uznałem że to nie jest zbyt jasne co jest co dla programu i dlatego to co podałeś zmodyfikowałem do mojej formy ale tak czy siak obydwa kody mi nie działają tak jak wspominałem wyżej tak jakby tych linijek kodu by nie było
Tutaj miesza ten warunek :

Kod: Zaznacz cały

if(Volume[0]>1)
return;
Dlatego rozbiłbym to na dwie funkcje:

Kod: Zaznacz cały

void CheckForOpen()
{
int q;// określenie czasu rozpoczęcia transakcji

// początek części kodu co działa
if(Volume[0]>1)
return;
if(Close[1]>Close[90])
{ 
SL=0;TP=0;
if(StopLoss>0)
SL=Ask-Point*StopLoss;
if(TakeProfit>0)
TP=Ask+Point*TakeProfit;
res=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,SL,TP,"MACD",MAGICMA,0,BuyColor);
q=TimeCurrent();//q jest liczbą sekund od 1970 do otwarcia pozycji
if(res<0)
{
Print("Error when opening a BUY order #",GetLastError());
Sleep(10000);
return;
}
}//koniec części kodu co działa

}

Kod: Zaznacz cały

int CLOSE(){
   for (int p = OrdersTotal(); p >=0; p--) {
      OrderSelect(p, SELECT_BY_POS, MODE_TRADES);{
      
      if((TimeCurrent()- OrderOpenTime())>180){
      if (OrderType() == OP_BUY && Symbol() == OrderSymbol() ) {OrderClose( OrderTicket(), OrderLots(), Bid, 1, Yellow);}
      if (OrderType() == OP_SELL && Symbol() == OrderSymbol()) {OrderClose( OrderTicket(), OrderLots(), Ask, 1, Yellow);}
    
    }
   }
  }
return(0);
}
Teraz powinno działać.

TesterForex
Stały bywalec
Stały bywalec
Posty: 43
Rejestracja: 22 gru 2016, 12:45

Re: STOP

Nieprzeczytany post autor: TesterForex »

Masz jakąś niestandardową funkcję OrderSend, ale prawdopodobnie zmienna MAGICMA nie przechowuje ticketu zlecenia tylko numer magic. Jeśli tak jest, to OrderSelect(MAGICMA, SELECT_BY_TICKET) oraz OrderClose(MAGICMA, ...) nie mogą zadziałać. Ticket ostatniego wysłanego zlecenia powinieneś mieć w zmiennej res.

Przy takim samodzielnym kombinowaniu bardzo przydaje się funkcja Print (albo debugger, ale moim zdaniem jest mniej wygodny do takich roboczych prób i błędów). Jak nie działa jakiś if, to możesz zrobić

Kod: Zaznacz cały

if(coś tam){
 Print("Warunek jakiśtam został spełniony");
}
Jeśli nie wchodzi do tego ifa, mimo że według założeń powinno, to można iść dalej i printować sam warunek i tak aż dojdziesz do tego, co konkretnie nie działa.

Pewnie jak zrobisz Print( OrderSelect(MAGICMA, SELECT_BY_TICKET) ), to nawet po wystawionym zleceniu będzie pokazywało "false" i wtedy już będziesz wiedział, że jest coś nie tak z tą funkcją.
Współautor interaktywnego kursu MQL4 dla serwisu fxwatch

MŁA
Bywalec
Bywalec
Posty: 14
Rejestracja: 17 lis 2011, 19:56

Re: STOP

Nieprzeczytany post autor: MŁA »

I dalej mam zonk algorytm nie działa może przedstawie 100% kodu na jakim pracuje od razu mówię że to jest taki zlepek nad którym już jakiś czas pracuje który powstałe z tego https://www.mql5.com/en/articles/1385 na tej podstawie bawiłem się ze średnimi i z macd ale średnio to wychodziło . Kod który wrzuciłem poniżej rozumiem w jakimś 70-80% i właśnie nie wiem czy tych 20-30% nie ma czegoś co blokuje ten stop:
//+------------------------------------------------------------------+
//| Moving Average_Мodified.mq4 |
//| Copyright © 2013, MetaQuotes Software Corp. |
//| Modified by BARS |
//+------------------------------------------------------------------+
#define MAGICMA 20050610
//-----------------------------------------
extern int StopLoss = 500;
extern int TakeProfit = 500;
extern double Lots = 0.1;
extern double MaximumRisk = 0.02;
extern double DecreaseFactor = 3;

extern color BuyColor = clrCornflowerBlue;
extern color SellColor = clrSalmon;

extern double pips =0.01;
int q;
//---
double SL=0,TP=0;
//-- Include modules --
#include <stderror.mqh>
#include <stdlib.mqh>
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void start()
{
//--- If there are more than 100 bars in the chart and the trade flow is free
if(Bars<100 || IsTradeAllowed()==false)
return;
//--- If the calculated lot size is in line with the current deposit amount
if(CalculateCurrentOrders(Symbol())==0)
CheckForOpen(); // start working
else
CheckForClose(); // otherwise, close positions
}
//+------------------------------------------------------------------+
//| Determines open positions |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
{
int buys=0,sells=0;
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++;
}
}
//---- return orders volume
if(buys>0)
return(buys);
else
return(-sells);
}
//+------------------------------------------------------------------+
//| Calculates the optimum lot size |
//+------------------------------------------------------------------+
double LotsOptimized()
{
double lot=Lots;
int orders=HistoryTotal(); // history orders total
int losses=0; // number of loss orders without a break
//---- select lot size
lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
//---- calcuulate number of loss orders without a break
if(DecreaseFactor>0)
{
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
Print("Error in history!");
break;
}
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL)
continue;
//----
if(OrderProfit()>0)
break;
if(OrderProfit()<0)
losses++;
}
if(losses>1)
lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
}
//---- return lot size
if(lot<0.1)
lot=0.1;
return(lot);
}
//+------------------------------------------------------------------+
//| Position opening function |
//+------------------------------------------------------------------+
void CheckForOpen()
{



int res;
if(Volume[0]>1)
return;
//open sell

if(Close[1]>Close[90]

//-----filtry
)
{
SL=0;TP=0;
if(StopLoss>0)
SL=Ask-Point*StopLoss;
if(TakeProfit>0)
TP=Ask+Point*TakeProfit;
res=WHCOrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,SL,TP,"MACD",MAGICMA,0,BuyColor);
q=TimeCurrent();
if(res<0)
{
Print("Error when opening a BUY order #",GetLastError());
Sleep(10000);
return;
}
}
}
int CLOSE(){
for (int p = OrdersTotal(); p >=0; p--) {
OrderSelect(p, SELECT_BY_POS, MODE_TRADES);{

if((TimeCurrent()- OrderOpenTime())>18000){
if (OrderType() == OP_BUY && Symbol() == OrderSymbol() ) {OrderClose( OrderTicket(), OrderLots(), Bid, 1, Yellow);}
if (OrderType() == OP_SELL && Symbol() == OrderSymbol()) {OrderClose( OrderTicket(), OrderLots(), Ask, 1, Yellow);}

}
}
}
return(0);
}
//+------------------------------------------------------------------+
//| Position closing function |
//+------------------------------------------------------------------+
void CheckForClose()
{
double ma;
//---- go trading only for first tiks of new bar
//(start working at the first tick of the new bar)
if(Volume[0]>1) return;
//---- get Moving Average

//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
//---- check order type
if(OrderType()==OP_BUY)
{
if(Open[1]>ma && Close[1]<ma)
OrderClose(OrderTicket(),OrderLots(),Bid,3,BuyColor); break;
}
if(OrderType()==OP_SELL)
{
if(Open[1]<ma && Close[1]>ma)
OrderClose(OrderTicket(),OrderLots(),Ask,3,SellColor); break;
}
}
}
//+-------------------------------------------------------------------+
//| Opens positions in Market Execution mode |
//+-------------------------------------------------------------------+
int WHCOrderSend(string symbol,
int cmd,
double volume,
double price,
int slippage,
double stoploss,
double takeprofit,
string comment,
int magic,
datetime expiration,
color arrow_color)
{
int ticket=OrderSend(symbol,cmd,volume,price,slippage,0,0,comment,magic,expiration,arrow_color);
int check=-1;
if(ticket>0 && (stoploss!=0 || takeprofit!=0))
{
if(!OrderModify(ticket,price,stoploss,takeprofit,expiration,arrow_color))
{
check=GetLastError();
if(check!=ERR_NO_MQLERROR)
Print("OrderModify error: ",ErrorDescription(check));
}
}
else
{
check=GetLastError();
if(check!=ERR_NO_ERROR)
Print("OrderSend error: ",ErrorDescription(check));
}
return(ticket);
}
//+------------------------------------------------------------------+
TesterForex'ie MAGICMA jest zadeklarowane na samym początku kodu a w jaki sposób używasz tego if od print? bo ja biorę robota i wrzucam w optymalizacje co mi wypluwa optymalizator otwieram na wykresie i patrze co się dzieje

TesterForex
Stały bywalec
Stały bywalec
Posty: 43
Rejestracja: 22 gru 2016, 12:45

Re: STOP

Nieprzeczytany post autor: TesterForex »

Ok, MAGICMA to numer magic, a to nie jest to samo co ticket. Ale to już poprawiłeś zgodnie z tym co pisał Jarek.

Masz błąd w funkcji CheckForClose():
Deklarujesz zmienną ma, ale potem nie przypisujesz jej żadnej wartości. Dopóki nie wyliczysz wartości średniej (funkcja iMA), to w zmiennej ma prawdopodobnie będzie 0. Dlatego warunki Open[1]>ma && Close[1]<ma oraz Open[1]<ma && Close[1]>ma nigdy nie będą spełnione.

Kod: Zaznacz cały

void CheckForClose()
  {
   double ma;
//---- go trading only for first tiks of new bar
//(start working at the first tick of the new bar)
   if(Volume[0]>1) return;
//---- get Moving Average
//Tu mogłeś coś przez pomyłkę skasować

//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //---- check order type
      if(OrderType()==OP_BUY)
        {
         Print("wartosc zmiennej ma: ", ma);
         if(Open[1]>ma && Close[1]<ma)
            OrderClose(OrderTicket(),OrderLots(),Bid,3,BuyColor); break;
        }
      if(OrderType()==OP_SELL)
        {
         Print("wartosc zmiennej ma: ", ma);
         if(Open[1]<ma && Close[1]>ma)
            OrderClose(OrderTicket(),OrderLots(),Ask,3,SellColor); break;
        }
     }
  }
Co do printa, to umieszczasz go w wybranym miejscu w kodzie, odpalasz robota na jakimś wykresie, wchodzisz w zakładkę "Strategie/Experts" i patrzysz czy pojawia się tam tekst z funkcji Print i co to za tekst. Dzięki temu możesz w prosty sposób przekonać się co robot w danym momencie widzi. Dodałem printy do tej funkcji, żebyś zobaczył o co chodzi.
Współautor interaktywnego kursu MQL4 dla serwisu fxwatch

MŁA
Bywalec
Bywalec
Posty: 14
Rejestracja: 17 lis 2011, 19:56

Re: STOP

Nieprzeczytany post autor: MŁA »

Dzięki że zająłeś się "moim" kodem tylko ta część kodu którą analizowałeś to pozostałość po wzorze z linku który wrzuciłem zostawiłem to z prostej przyczyny algorytm działa to dobrze jak coś skasuje to może przestać działać bardziej mi chodzi o ten stop czasowy :
int CLOSE(){
for (int p = OrdersTotal(); p >=0; p--) {
OrderSelect(p, SELECT_BY_POS, MODE_TRADES);{

if((TimeCurrent()- OrderOpenTime())>18000){
if (OrderType() == OP_BUY && Symbol() == OrderSymbol() ) {OrderClose( OrderTicket(), OrderLots(), Bid, 1, Yellow);}
if (OrderType() == OP_SELL && Symbol() == OrderSymbol()) {OrderClose( OrderTicket(), OrderLots(), Ask, 1, Yellow);}

}
}
}
return(0);
}
ogólnie z tego wzoru z linku można zbudować wiele https://www.mql5.com/en/articles/1385 tylko są pewne niuanse w kilku aspektach programowania które jak mi się wydaje są specyficzne dla mql4 oczywiście to może z wynikać z mojej niewiedzy bo mam bardzo skromne doświadczenie w delphi, c++ i HTML z przed wielu lat :) reasumując w algorytmie o to mi chodzi: jesli Close[1]>Close[90] otwórz i jesli w 18000 sekund nie dojdzie do tp lub sl to zamknij

TesterForex
Stały bywalec
Stały bywalec
Posty: 43
Rejestracja: 22 gru 2016, 12:45

Re: STOP

Nieprzeczytany post autor: TesterForex »

Ok, jeżeli chodziło o CLOSE(), to problem był z tym, że nie wywoływałeś tej funkcji. Sama funkcja jest ok i działa. Musisz ją wywołać w start():

Kod: Zaznacz cały

void start()
  {
//--- If there are more than 100 bars in the chart and the trade flow is free
   if(Bars<100 || IsTradeAllowed()==false)
      return;
//--- If the calculated lot size is in line with the current deposit amount
   if(CalculateCurrentOrders(Symbol())==0)
      CheckForOpen(); // start working
   else
      CLOSE(); // otherwise, close positions 
  }

Generalnie program program mql działa tak, że masz funkcję główną, która jest wywoływana przez jakieś wydarzenie (nowy tick, uruchomienie programu, upływ czasu itp.) i w niej musisz umieszczać to co ma się wykonać.
Współautor interaktywnego kursu MQL4 dla serwisu fxwatch

MŁA
Bywalec
Bywalec
Posty: 14
Rejestracja: 17 lis 2011, 19:56

Re: STOP

Nieprzeczytany post autor: MŁA »

IT'S ALIVE!! :) a miałbyś może link do instrukcji w jakie moduły należy wrzucać funkcje? jaka jest architektura mql?

ODPOWIEDZ