Bitcoin Forum
November 14, 2024, 04:54:51 AM *
News: Latest Bitcoin Core release: 28.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: « 1 ... 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 [65] 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 »
  Print  
Author Topic: Qt Bitcoin Trader [Open Source secure trading client for Mac/Windows/Linux]  (Read 383519 times)
voxelot
Sr. Member
****
Offline Offline

Activity: 265
Merit: 250


View Profile
April 27, 2015, 01:10:36 AM
 #1281

Greetings, First thank you for the open source software.

I'm sorry if this has been asked before but has anyone been successful adding new exchanges to Qt Trader? I would like to customize the software to connect to some new exchange APIs.

Thanks for the reply.
amoebatron
Newbie
*
Offline Offline

Activity: 3
Merit: 0


View Profile
April 27, 2015, 12:07:04 PM
 #1282

Poloniex support?
rangedriver
Hero Member
*****
Offline Offline

Activity: 714
Merit: 504



View Profile
May 04, 2015, 08:07:19 PM
 #1283

Anyone know a way I can get 'AsksPrice' by USD volume, when trading BTC/USD?

I'm familiar with the function trader.get("AsksPrice",volume), but this requires me knowing the volume in BTC. How do I convert to USD?

In short, I'm trying to create a function that will establish the lowest price in the order book that I can execute a market buy based on my current USD balance.

I can't do:-

Code:
var myUSD = trader.get("Balance","USD");
var price = trader.get("AsksPrice",myUSD);

and neither can I do:-

Code:
var myUSD = trader.get("Balance","USD");
var price = trader.get("AsksPrice",myUSD/price);

Any help would be appreciated!
Askit2
Hero Member
*****
Offline Offline

Activity: 981
Merit: 500


DIV - Your "Virtual Life" Secured and Decentralize


View Profile
May 08, 2015, 07:15:21 AM
Last edit: May 08, 2015, 08:33:57 PM by Askit2
 #1284

Anyone know a way I can get 'AsksPrice' by USD volume, when trading BTC/USD?

I'm familiar with the function trader.get("AsksPrice",volume), but this requires me knowing the volume in BTC. How do I convert to USD?

In short, I'm trying to create a function that will establish the lowest price in the order book that I can execute a market buy based on my current USD balance.

I can't do:-

Code:
var myUSD = trader.get("Balance","USD");
var price = trader.get("AsksPrice",myUSD);

and neither can I do:-

Code:
var myUSD = trader.get("Balance","USD");
var price = trader.get("AsksPrice",myUSD/price);

Any help would be appreciated!

try this:
Code:
var price = trader.get("AskPrice");
var myVolume = trader.get("Balance","USD") /price;
price = trader.get("AsksPrice", myVolume);

Most software doesn't handle math inside function calls. Doing all the math for it in advance helps a lot. The one problem I see with my suggestion is You need a starting price. Now you won't know for sure that the price of the current ask is the price the bot would settle on. If the price change where too high it could cause some error in the actual volume. This should be fairly small I would think but if it turns out to be non-negligible you might want to rerun the last two lines again. Like this.

Code:
var price = trader.get("AskPrice");
var myVolume = trader.get("Balance","USD") /price;
price = trader.get("AsksPrice", myVolume);
myVolume = trader.get("Balance","USD") /price;
price = trader.get("AsksPrice", myVolume);

This would find a price that should support your balance then use that price to try again. It should reduce the error amount but will not entirely eliminate it as the volume is based on price and as the price changes so will the volume. For small enough amounts the first should work perfectly. For large enough amounts there would likely need to be either an acceptable error rate or one could adjust the initial volume by some amount to make sure that the final price would definitely have the volume to cover it.

EDIT: After sleeping on this problem I can conclude that the worry I had about errors should be more or less a non-issue. As the price goes up the volume would actually be decreasing. The first example should work without issues. If it does not could you let everyone know? I may have another way to solve it if none of the above works for you.

          ▄▄
        ▄█▀▀█▄
      ▄█▀ ▄▄ ▀█▄
      ▀ ▄████▄ ▀
   ▄▀ ▄ ▀████▀ ▄ ▀▄
 ▄▀ ▄███▄ ▀▀ ▄███▄ ▀▄
█  ███████  ███████  █
 ▀▄ ▀███▀ ▄▄ ▀███▀ ▄▀

   ▀▄ ▀ ▄████▄ ▀ ▄▀
      ▄ ▀████▀ ▄
      ▀█▄ ▀▀ ▄█▀
        ▀█▄▄█▀
          ▀▀
███████████████████████████████████████████████████████████████████
██████▀▀▀▀▀▀▀▀▀▀▀██████████▀▀▀▀▀████▀▀▀▀▀█████▀▀▀▀█████▀▀▀▀▀███████
██████            ▀████████     ████     █████    █████     ███████
██████     ▄▄▄▄▄    ▀██████     █████    ████      ████    ████████
██████     ██████▄    █████     █████    ▀██▀  ▄▄  ▀██▀    ████████
██████     ███████    █████     ██████    ██   ██   ██    █████████
██████     ███████    █████     ██████    ██   ██   ██    █████████
██████     ███████    █████     ██████     █   ██   █     █████████
██████     █████▀    ██████     ███████       ████       ██████████
██████     ▀▀▀▀▀    ▄██████     ████████     ██████     ███████████
██████            ▄████████     ████████     ██████     ███████████
██████▄▄▄▄▄▄▄▄▄▄▄██████████▄▄▄▄▄█████████▄▄▄▄██████▄▄▄▄████████████
███████████████████████████████████████████████████████████████████
.DIWtoken.com.
▄██████████████████▄
███       ▀███████
███       █████████
███       █████████
███       █████████
███              ██
███   ▄▄▄▄▄▄▄▄   ███
███   ▄▄▄▄▄▄▄▄   ███
███              ███
███▄▄▄▄▄▄▄▄▄▄▄▄▄▄███
██████████████████▀

▄██████████████████▄
███████████▀ ███████
█████████▀   ███████
███████▀     ██▀ ███
███ ▀▀       █▄▄████
███          █▀▀▀▀██
███ ▄▄       ███████
██████▄     █▄ ▀███
█████████▄   ███▄███
███████████▄ ███████
▀██████████████████▀

▄██████████████████▄
████████████████████
███████████████▀▀ ██
█████████▀▀     ███
████▀▀     ▄█▀   ███
███▄    ▄██      ███
█████████▀      ▄██
█████████▄     ████
█████████████▄ ▄████
████████████████████
▀██████████████████▀
......SECURITY DECENTRALIZED...
prince_k
Member
**
Offline Offline

Activity: 82
Merit: 10


View Profile
June 08, 2015, 01:56:59 PM
 #1285

Please fix QT for Bitfinex api (on Win)
Buttons "all in", "half in" won't work at all. Also if you press BUY and confirm your order - nothing happens...
wdnj
Hero Member
*****
Offline Offline

Activity: 762
Merit: 500



View Profile
June 09, 2015, 12:57:25 PM
 #1286

Can I run this on Cent-OS?
PuertoLibre
Legendary
*
Offline Offline

Activity: 1890
Merit: 1003


View Profile
June 11, 2015, 08:54:28 PM
 #1287

I was looking at the programming built into QT bitcoin and making a sheet that helps me bring into focus my program. But I see that the way things are labeled don't appear to make much sense.

Example:

Full Size Link: https://i.imgur.com/aFfu6Ne.png
IGHOR (OP)
Legendary
*
Offline Offline

Activity: 1035
Merit: 1065



View Profile WWW
July 04, 2015, 12:23:13 AM
 #1288

I was looking at the programming built into QT bitcoin and making a sheet that helps me bring into focus my program. But I see that the way things are labeled don't appear to make much sense.

Example:

Full Size Link: https://i.imgur.com/aFfu6Ne.png

Thanks.

Qt Bitcoin Trader
Verify digital signature of the app in the file properties every time you download it.
IGHOR (OP)
Legendary
*
Offline Offline

Activity: 1035
Merit: 1065



View Profile WWW
July 04, 2015, 12:23:56 AM
 #1289

Qt Bitcoin Trader v1.1 Released!

New floating interface with workspaces
Charts
Internal NTP client
Added new exchange bitmarket.pl
Fixed minor bugs
Qt4 is no longer supported
New script engine delayed and will come in next updates

Download: https://centrabit.com/?m0prm=6

Qt Bitcoin Trader
Verify digital signature of the app in the file properties every time you download it.
PuertoLibre
Legendary
*
Offline Offline

Activity: 1890
Merit: 1003


View Profile
July 08, 2015, 10:15:35 PM
 #1290

Thanks for the fix,

I have a couple of ideas on feature requests, both big and small, important and minor.

-----------------------------------

One of thee most important feature requests is:

The ability to enumerate your open bids and/or asks.
At this time, if I ask the server/application how many bids are open, it only gives me a "Count" of open orders.

This means unless you know the original balance at the start, it is pretty much impossible to know how many Asks you have open nor their quantity per slot.

-----------------------------------

For example, if I ask, how many Asks do I have open.

The program only responds "3".

There is seemingly no way to enumerate their details, for example,

When were they were initiated? trader.get(AsksTime,"Slot1")

At what price (for re-positioning Asks) trader.get(AsksPrice,"Slot1")

How much does each slot have? trader.get(AsksAmount,"Slot1") or trader.get(AsksTotal) or trader.get(AsksTotal,"Slot1")

--------------------------------------

All of these things could be gathered from the UserInterface but not programatically.

PuertoLibre
Legendary
*
Offline Offline

Activity: 1890
Merit: 1003


View Profile
July 08, 2015, 10:24:07 PM
 #1291

The next feature request:

A minor request of two different things.

I see there is a way to confirm an action as a form of protection.

------------------------------------

Request 1:

A tick box (or password feature) which disables the application interface while it is open. (Specifically the buy and sell boxes)

Why?
After writing a few programs I like to watch the console for certain indicators I have programmed, but sometimes I have fallen asleep nearby and our cat/dog/baby will crawl over the keyboard. So out of a force of habit I minimize the screen to prevent accidental interaction.

------------------------------------
Request 2:

The unavoidable accident. Since I haven't tested it, I don't know if it is a problem or not.

I noticed in the prior version that the values in the buy and sell interface would always default to the most recent price activity. But now, disturbingly, they are set to 0.000.

While I am not brave enough to try and see if I can buy or sell my coins/fiat at 0.000. I think this recent application behavior could cause some problems.
IGHOR (OP)
Legendary
*
Offline Offline

Activity: 1035
Merit: 1065



View Profile WWW
July 08, 2015, 10:45:01 PM
 #1292

Nice idea. I'll add it to my list of features todo
Enumerate own orders, orderbook and trade history is coming in next updates.
Also tracking exact order state and cancel by id.
About recent price value, this is bug and will be fixed soon.


The next feature request:

A minor request of two different things.

I see there is a way to confirm an action as a form of protection.

------------------------------------

Request 1:

A tick box (or password feature) which disables the application interface while it is open. (Specifically the buy and sell boxes)

Why?
After writing a few programs I like to watch the console for certain indicators I have programmed, but sometimes I have fallen asleep nearby and our cat/dog/baby will crawl over the keyboard. So out of a force of habit I minimize the screen to prevent accidental interaction.

------------------------------------
Request 2:

The unavoidable accident. Since I haven't tested it, I don't know if it is a problem or not.

I noticed in the prior version that the values in the buy and sell interface would always default to the most recent price activity. But now, disturbingly, they are set to 0.000.

While I am not brave enough to try and see if I can buy or sell my coins/fiat at 0.000. I think this recent application behavior could cause some problems.

Qt Bitcoin Trader
Verify digital signature of the app in the file properties every time you download it.
PuertoLibre
Legendary
*
Offline Offline

Activity: 1890
Merit: 1003


View Profile
July 09, 2015, 02:29:42 AM
 #1293

Another set of feature requests:

At the moment, when your application processes values within a script, it will turn any math resulting in a negative number into a "0".

For example, if you are trying to calculate a percentage, you have to force the value to turn into a positive number in order to see it in the console. Otherwise, it always becomes a "0".
IGHOR (OP)
Legendary
*
Offline Offline

Activity: 1035
Merit: 1065



View Profile WWW
July 09, 2015, 08:52:19 AM
 #1294

Another set of feature requests:

At the moment, when your application processes values within a script, it will turn any math resulting in a negative number into a "0".

For example, if you are trying to calculate a percentage, you have to force the value to turn into a positive number in order to see it in the console. Otherwise, it always becomes a "0".

It console bug. Thanks I'll fix it.
Temporary solution - convert numbers to string using javascript.

Qt Bitcoin Trader
Verify digital signature of the app in the file properties every time you download it.
rangedriver
Hero Member
*****
Offline Offline

Activity: 714
Merit: 504



View Profile
July 09, 2015, 11:25:34 AM
 #1295

How about Poloniex support for Monero (XMR) trading?

I can donate to make this happen.
macromind
Newbie
*
Offline Offline

Activity: 3
Merit: 0


View Profile
July 09, 2015, 10:23:57 PM
 #1296

Which software package did you use to code the software? I am seeing QT but which version? Any link? I would like to look at enhance the charts component and would like the same IDE as you. It isnt a VS project as Visual Studio doesnt recognize it. I tried QT 5.5 and its still not recognized as a QT project.

Thanks!
PuertoLibre
Legendary
*
Offline Offline

Activity: 1890
Merit: 1003


View Profile
July 10, 2015, 03:34:29 AM
 #1297

@ Ighor

Do all (or only some) of the programmatic commands query the application itself, or does it query the server directly?

For example, if I write trader.get("AskPrice")

Does this query the application internally that collects this information, or does this query go to the api and the server answers the request?

----------------------

The reason I ask is because I am trying to determine if by writing a heavy number of queries if I am accidentally hammering the server api (through my internet connection) or if I am just hammering the application with the information it has available on hand, to answer the requests?

I noticed that in one command (asksprice, volume) you state that the application has to have a certain number of available order book rows visible for it to work properly. But it is unclear if that is because the application itself is answering the queries with whatever information it has on hand

OR

If the application just has a quirk that needs a certain number of internal settings to assigns internal values and then hands off the queries to an external server api to get an answer.

I am trying to prevent hammering the BTC-e exchange with queries so I would like to know if the application acts like an aggregate of data. In so far as the application answers some of the queries itself and only a few specific commands are answered by the server itself.
soothaa
Hero Member
*****
Offline Offline

Activity: 1151
Merit: 528



View Profile
July 10, 2015, 08:28:06 PM
 #1298

Hey there, I love this project so much. It's so well made and makes so much sense, thanks a million!

May I ask why Crypsty is not supported, it's such a major exchange. I've checked out your code and will begin to write my own Cryptsy support this weekend unless you have it on your roadmap Smiley

Want increased coin support within AwesomeMiner? Try my free plugin to add support for nearly any coin! https://bitcointalk.org/index.php?topic=2979494
Want Masternode income stats within AwesomeMiner? Try my free plugin to add support for them! https://bitcointalk.org/index.php?topic=3047367
Askit2
Hero Member
*****
Offline Offline

Activity: 981
Merit: 500


DIV - Your "Virtual Life" Secured and Decentralize


View Profile
July 10, 2015, 11:50:39 PM
Last edit: July 13, 2015, 07:53:09 AM by Askit2
 #1299

Hello,
about 18 hours ago my UI for QtBitcoinTrader disappeared. The application did not crash. It is still running it appears in the background. It was showing for a moment when I turned on the TV (monitor replacement). As I have no crash log it likely wouldn't be helpful to you. So far this is unconfirmed. I was running two instances with separate API key pairs etc. Both user interfaces are gone but both processes keep running. I am using the command line to stop them but hoping I don't have to force them to close.

Running windows 7 64 bit. QtBTCT V. 1.1.
Another side issue. When I upgraded there was a crash. the crash happened on the version just before 1.1 as the bug fix release showed up after the restart. This crash was after a few hours of running and at least one restart. The problem is the crash killed my API key pair. I didn't lose any trading logic so its fine. Since BTCe replies with what the number is to sign the connection it should be possible to make the trader more crash tolerant. I remember the reasoning being that if someone did get on your API connection you would definitely know there was a problem. I have been thinking about it myself and it seems to me a feature request could be in order. The default behavior is nice. It is very exact and very easy to see. Possibly in the debug window or somewhere in settings add a button to correct to what the server lists for authorization. Making this manual would leave the very obvious notice to people something went wrong. They should check on their account etc. If nothing is awry though blowing out a profile to make the same profile with a different key pair seems wasteful to me. Even just being able to change the key pair without a new profile would be great.

Running Arch Linux Raspberry pi model B. QTBCT V1.1
After I upgraded the trader ran for 3 hours of so before it crashed or seemed to crash. When restarted the API was not working just like the windows machines I did the day before. The bug fix release is the only one I upgraded to.

So far this was a one time crash just after upgrading. I'm not sure of the cause. If it didn't take the API with it I likely wouldn't even mention it.

EDIT: taskkill /IM QtBitcoinTrader.exe did not in 15 minutes stop the application. taskkill /IM QtBitcoinTrader.exe /F did but when restarted I had no API. Is there a better way to close the application when the user interface goes absent without leave?

EDIT 2: On the raspberry pi running arch I only show version 1.1 on windows 7 I show version 1.10. 01. It seems I need to upgrade. I have tried compiling but so far I am not getting the newest code base it appears. I have fetched all and merged. I think its my checkout beta that is screwing things up. I am trying checkout 1.10.01. not sure it will fix it but here is hoping.

The raspberry pi setup wouldn't be so bad but everything is slow. Compile takes ~4 hours. Midori takes it seems like 30 minutes to sign in and navigate btce. Creating a profile is another minute with copying. Then comes the real trouble. I can't edit the ini file until the bot has run. This is a problem as it 1 defaults to USD/BTC and that ticker is very busy, 2 it has a request interval of 400 making it ask for data more often then it can even keep up with, and 3 the UI refresh is set to 100 making a lot of processing go into (I guess) redrawing the screen. None of these are issues on more full powered PC's These are all issues directly with the raspberry pi's limited processor. If the ini file populated completely before the first use of the trader I could change request timing to 1500 that keeps me unbanned with 3 bots running on 2 computers, the UI refresh to 750 making the screen update twice per new data, and I could manually start on the much less busy ticker I want to use anyway of NMC/BTC. I know the processor is too slow to keep up as with the defaults I was getting new trading data more then 5 minutes after I pulled the networking cable. This would show me that the computer can't keep up and has a backlog. It does keep up fine with my changes.

If I get updated to the current version I hope the main crashing issue will go away. I have make 8 API key pairs in 48 hours for the Raspberry pi. It would be nice to have a way to just change the key pair rather then building a whole new profile. Completely separate from the time delay because this computer is very slow I have a few difficulties keeping the new profile correct. 1 I need a current version of my script backed up somewhere, 2 I need to copy it from the back up into the new profile. Somehow I messed up #2. I  used a very old script that didn't work completely. Maybe more crashes because of this maybe not. This is my mistake. I did cause it. I wouldn't have had to keep track of the backup file as well if I had been able to either resync the API as the crash was the cause of the API issues or change the API key pair in the current profile.

I am not sure where to pull logs from on Arch Linux. I think the log location is set by the application. I am fairly new to arch. If I am right and I am using a very old code base it is unlikely to help you no matter what I did.

I would really like an easier way to update the API key pair and a way to manually force the bot to use the servers suggestion for the number that signs the request. These do not need to be automatic and shouldn't be automatic. A button or something in settings to change the API key pair would be good, a button to synchronize the API connection to the server would save me about 30 minutes per crash minimum. The time savings would be much greater as it takes about 1 minute to change the ticker then 2 or so to change the settings. Once done with that I have to hope restarting doesn't kill the API and force me to start over. For some hardware this would save maybe 2 minutes. Very handy but not a big issue. For the Raspberry pi the issue is pretty bad.

Edit 3: Most of the problems are caused by me. 1) I used apparently a non-existant branch. I'm sure it existed before but it doesn't now. Maybe it never existed at all. 2) I did not reference the correct project file. I apparently used QtBitcoinTrader.pro instead of QtBitcoinTrader_Desktop. I am sure it existed when I setup the script to automate this. After changing both parts I now have on my Raspberry Pi V1.10.01.

As far as the other issues I have a solution for them. It is blindingly simple and I wish I had thought of it sooner as it would have saved me a lot of time. Pull the network cable on the first run of the UI. No network data to pull, sort, display less processor usage dealing with it when I have to change the ticker or the request interval. Once the first part is done edit the .ini file for the UI so that the delay can be increased beyond 100 for the Raspberry pi.  It just is too fast. There is nothing wrong with it except on limited hardware. Once configured I have occasional spikes to 100% but mostly it isn't constantly that high. It does appear the graphs take a bit of CPU power even when not actively selected. This has moved up from 40% average to maybe 60%. It could average a bit higher but it isn't pinned with the request interval at 1500 and the UI at 750. Truthfully at least on this hardware the 750 seems more fluid then the 100 for the UI. 

          ▄▄
        ▄█▀▀█▄
      ▄█▀ ▄▄ ▀█▄
      ▀ ▄████▄ ▀
   ▄▀ ▄ ▀████▀ ▄ ▀▄
 ▄▀ ▄███▄ ▀▀ ▄███▄ ▀▄
█  ███████  ███████  █
 ▀▄ ▀███▀ ▄▄ ▀███▀ ▄▀

   ▀▄ ▀ ▄████▄ ▀ ▄▀
      ▄ ▀████▀ ▄
      ▀█▄ ▀▀ ▄█▀
        ▀█▄▄█▀
          ▀▀
███████████████████████████████████████████████████████████████████
██████▀▀▀▀▀▀▀▀▀▀▀██████████▀▀▀▀▀████▀▀▀▀▀█████▀▀▀▀█████▀▀▀▀▀███████
██████            ▀████████     ████     █████    █████     ███████
██████     ▄▄▄▄▄    ▀██████     █████    ████      ████    ████████
██████     ██████▄    █████     █████    ▀██▀  ▄▄  ▀██▀    ████████
██████     ███████    █████     ██████    ██   ██   ██    █████████
██████     ███████    █████     ██████    ██   ██   ██    █████████
██████     ███████    █████     ██████     █   ██   █     █████████
██████     █████▀    ██████     ███████       ████       ██████████
██████     ▀▀▀▀▀    ▄██████     ████████     ██████     ███████████
██████            ▄████████     ████████     ██████     ███████████
██████▄▄▄▄▄▄▄▄▄▄▄██████████▄▄▄▄▄█████████▄▄▄▄██████▄▄▄▄████████████
███████████████████████████████████████████████████████████████████
.DIWtoken.com.
▄██████████████████▄
███       ▀███████
███       █████████
███       █████████
███       █████████
███              ██
███   ▄▄▄▄▄▄▄▄   ███
███   ▄▄▄▄▄▄▄▄   ███
███              ███
███▄▄▄▄▄▄▄▄▄▄▄▄▄▄███
██████████████████▀

▄██████████████████▄
███████████▀ ███████
█████████▀   ███████
███████▀     ██▀ ███
███ ▀▀       █▄▄████
███          █▀▀▀▀██
███ ▄▄       ███████
██████▄     █▄ ▀███
█████████▄   ███▄███
███████████▄ ███████
▀██████████████████▀

▄██████████████████▄
████████████████████
███████████████▀▀ ██
█████████▀▀     ███
████▀▀     ▄█▀   ███
███▄    ▄██      ███
█████████▀      ▄██
█████████▄     ████
█████████████▄ ▄████
████████████████████
▀██████████████████▀
......SECURITY DECENTRALIZED...
macromind
Newbie
*
Offline Offline

Activity: 3
Merit: 0


View Profile
July 10, 2015, 11:52:32 PM
 #1300

Hey there, I love this project so much. It's so well made and makes so much sense, thanks a million!

May I ask why Crypsty is not supported, it's such a major exchange. I've checked out your code and will begin to write my own Cryptsy support this weekend unless you have it on your roadmap Smiley

Which IDE did you use? Is the project easy to compile on Visual Studio or QT 5.5? Thanks a million!
Pages: « 1 ... 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 [65] 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 »
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!